Compare commits
100 Commits
@react-nav
...
@react-nav
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
25c3fc440f | ||
|
|
89fa363883 | ||
|
|
bec2f754d4 | ||
|
|
b277927925 | ||
|
|
72993c6463 | ||
|
|
3fbfb70699 | ||
|
|
abdf9d12b5 | ||
|
|
ba85db28d4 | ||
|
|
e5063b9339 | ||
|
|
ec35bd5821 | ||
|
|
22e306004a | ||
|
|
8a835b3556 | ||
|
|
d9237e9a0d | ||
|
|
0644ac03aa | ||
|
|
41a5e1a385 | ||
|
|
3d937d1e65 | ||
|
|
343320783f | ||
|
|
5411816188 | ||
|
|
d8bda604ee | ||
|
|
c70635b7d7 | ||
|
|
94d7b28c0b | ||
|
|
b19b3b2725 | ||
|
|
3dcec142f7 | ||
|
|
0c159db4c9 | ||
|
|
2479da98ed | ||
|
|
5197ee2a9c | ||
|
|
0ead2662ec | ||
|
|
5af5c29f07 | ||
|
|
d448cdc11f | ||
|
|
0e8fda3196 | ||
|
|
9198597b7f | ||
|
|
9be904d9c4 | ||
|
|
fa4a959549 | ||
|
|
d0510d0220 | ||
|
|
0b4bf1dcc8 | ||
|
|
5a3f8356b0 | ||
|
|
eeae11033a | ||
|
|
b931ae62df | ||
|
|
ea66b1a3b8 | ||
|
|
4bc0c8f66f | ||
|
|
68016de385 | ||
|
|
e55e866af2 | ||
|
|
50b366e734 | ||
|
|
edf96d839f | ||
|
|
141d397bdf | ||
|
|
0f18b91690 | ||
|
|
6262f7298b | ||
|
|
a6f58677dc | ||
|
|
9bfb295620 | ||
|
|
ecd68afb46 | ||
|
|
5fe140e61b | ||
|
|
944fa35ed4 | ||
|
|
2243b45cc1 | ||
|
|
5e7cfc4ac0 | ||
|
|
5751e7f97a | ||
|
|
179e807a64 | ||
|
|
2f1f0af862 | ||
|
|
9976a888a0 | ||
|
|
16c64e7298 | ||
|
|
f1fe951cf9 | ||
|
|
14250851d1 | ||
|
|
42586462fd | ||
|
|
3dede316cc | ||
|
|
63988e0da8 | ||
|
|
67b2ecfcfc | ||
|
|
68ed8a7259 | ||
|
|
6c2acbb304 | ||
|
|
84d75b37e7 | ||
|
|
65e5147910 | ||
|
|
321fa653ad | ||
|
|
2a76dc4d3c | ||
|
|
0a982ee698 | ||
|
|
1da4a6437f | ||
|
|
f1df4a0808 | ||
|
|
14ae3738cf | ||
|
|
32a2206513 | ||
|
|
38520a97ff | ||
|
|
3bf5ddde2a | ||
|
|
43d2c456be | ||
|
|
fe82276b1f | ||
|
|
1e53821d52 | ||
|
|
23ab45aceb | ||
|
|
d9059b56d8 | ||
|
|
ad4eaff1e9 | ||
|
|
da67e134d2 | ||
|
|
ee381a4ba3 | ||
|
|
3c5b8c4992 | ||
|
|
a912323c1d | ||
|
|
805e5e8636 | ||
|
|
65a5dac2bf | ||
|
|
536225c2c3 | ||
|
|
23f76189a4 | ||
|
|
f1f5b7197c | ||
|
|
324fad33ef | ||
|
|
d14c471385 | ||
|
|
7113540127 | ||
|
|
a23dfd419d | ||
|
|
e6fade010b | ||
|
|
beb9a151f0 | ||
|
|
c814636061 |
5
.github/ISSUE_TEMPLATE/config.yml
vendored
@@ -1,9 +1,12 @@
|
|||||||
blank_issues_enabled: false
|
blank_issues_enabled: false
|
||||||
contact_links:
|
contact_links:
|
||||||
|
- name: Troubleshooting
|
||||||
|
url: https://reactnavigation.org/docs/en/next/troubleshooting.html
|
||||||
|
about: Read how to troubleshoot and fix common issues and mistakes.
|
||||||
- name: Documentation
|
- name: Documentation
|
||||||
url: https://next.reactnavigation.org
|
url: https://next.reactnavigation.org
|
||||||
about: Read the official documentation.
|
about: Read the official documentation.
|
||||||
- name: Feature Requests
|
- name: Feature requests
|
||||||
url: https://react-navigation.canny.io/feature-requests
|
url: https://react-navigation.canny.io/feature-requests
|
||||||
about: Post a feature request on Canny.
|
about: Post a feature request on Canny.
|
||||||
- name: StackOverflow
|
- name: StackOverflow
|
||||||
|
|||||||
54
.github/workflows/expo-preview.yml
vendored
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
name: Expo Preview
|
||||||
|
on: [pull_request]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
publish:
|
||||||
|
name: Install and publish
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
if: github.event.pull_request.head.repo.owner.login == 'react-navigation'
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v1
|
||||||
|
|
||||||
|
- name: Setup Node.js
|
||||||
|
uses: actions/setup-node@v1
|
||||||
|
with:
|
||||||
|
node-version: 10.x
|
||||||
|
|
||||||
|
- name: Setup Expo
|
||||||
|
uses: expo/expo-github-action@v5
|
||||||
|
with:
|
||||||
|
expo-version: 3.x
|
||||||
|
expo-username: ${{ secrets.EXPO_CLI_USERNAME }}
|
||||||
|
expo-password: ${{ secrets.EXPO_CLI_PASSWORD }}
|
||||||
|
expo-cache: true
|
||||||
|
|
||||||
|
- name: Get yarn cache
|
||||||
|
id: yarn-cache
|
||||||
|
run: echo "::set-output name=dir::$(yarn cache dir)"
|
||||||
|
|
||||||
|
- name: Check yarn cache
|
||||||
|
uses: actions/cache@v1
|
||||||
|
with:
|
||||||
|
path: ${{ steps.yarn-cache.outputs.dir }}
|
||||||
|
key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}
|
||||||
|
restore-keys: |
|
||||||
|
${{ runner.os }}-yarn-
|
||||||
|
|
||||||
|
- name: Install dependencies
|
||||||
|
run: yarn
|
||||||
|
|
||||||
|
- name: Publish Expo app
|
||||||
|
working-directory: ./example
|
||||||
|
run: expo publish --release-channel=pr-${{ github.event.number }}
|
||||||
|
|
||||||
|
- name: Get expo link
|
||||||
|
id: expo
|
||||||
|
run: echo "::set-output name=path::@react-navigation/react-navigation-example?release-channel=pr-${{ github.event.number }}"
|
||||||
|
|
||||||
|
- name: Comment on PR
|
||||||
|
uses: unsplash/comment-on-pr@master
|
||||||
|
env:
|
||||||
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
with:
|
||||||
|
msg: The Expo app for the example from this branch is ready!<br><br>[expo.io/${{ steps.expo.outputs.path }}](https://expo.io/${{ steps.expo.outputs.path }})<br><br><a href="https://exp.host/${{ steps.expo.outputs.path }}"><img src="https://api.qrserver.com/v1/create-qr-code/?size=400x400&data=exp://exp.host/${{ steps.expo.outputs.path }}" height="200px" width="200px"></a>.
|
||||||
44
.github/workflows/expo.yml
vendored
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
name: Expo Publish
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- master
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
publish:
|
||||||
|
name: Install and publish
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v1
|
||||||
|
|
||||||
|
- name: Setup Node.js
|
||||||
|
uses: actions/setup-node@v1
|
||||||
|
with:
|
||||||
|
node-version: 10.x
|
||||||
|
|
||||||
|
- name: Setup Expo
|
||||||
|
uses: expo/expo-github-action@v5
|
||||||
|
with:
|
||||||
|
expo-version: 3.x
|
||||||
|
expo-username: ${{ secrets.EXPO_CLI_USERNAME }}
|
||||||
|
expo-password: ${{ secrets.EXPO_CLI_PASSWORD }}
|
||||||
|
expo-cache: true
|
||||||
|
|
||||||
|
- name: Get yarn cache
|
||||||
|
id: yarn-cache
|
||||||
|
run: echo "::set-output name=dir::$(yarn cache dir)"
|
||||||
|
|
||||||
|
- uses: actions/cache@v1
|
||||||
|
with:
|
||||||
|
path: ${{ steps.yarn-cache.outputs.dir }}
|
||||||
|
key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}
|
||||||
|
restore-keys: |
|
||||||
|
${{ runner.os }}-yarn-
|
||||||
|
|
||||||
|
- name: Install dependencies
|
||||||
|
run: yarn
|
||||||
|
|
||||||
|
- name: Publish Expo app
|
||||||
|
working-directory: ./example
|
||||||
|
run: expo publish
|
||||||
70
.github/workflows/main.yml
vendored
@@ -1,70 +0,0 @@
|
|||||||
|
|
||||||
name: Detox (iOS)
|
|
||||||
|
|
||||||
on: [push]
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
build:
|
|
||||||
runs-on: macOS-latest
|
|
||||||
timeout-minutes: 15
|
|
||||||
|
|
||||||
env:
|
|
||||||
DEVELOPER_DIR: /Applications/Xcode_11.2.app
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v1
|
|
||||||
|
|
||||||
- name: Use Node.js 10
|
|
||||||
uses: actions/setup-node@v1
|
|
||||||
with:
|
|
||||||
node-version: 12
|
|
||||||
|
|
||||||
- name: Get Yarn cache
|
|
||||||
id: yarn-cache
|
|
||||||
run: echo "::set-output name=dir::$(yarn cache dir)"
|
|
||||||
|
|
||||||
- name: Cache Yarn packages
|
|
||||||
uses: actions/cache@v1
|
|
||||||
with:
|
|
||||||
path: ${{ steps.yarn-cache.outputs.dir }}
|
|
||||||
key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}
|
|
||||||
restore-keys: ${{ runner.os }}-yarn-
|
|
||||||
|
|
||||||
- name: Install dependencies
|
|
||||||
if: steps.yarn-cache.outputs.cache-hit != 'true'
|
|
||||||
run: yarn --frozen-lockfile
|
|
||||||
|
|
||||||
- name: Cache Pods
|
|
||||||
uses: actions/cache@v1
|
|
||||||
with:
|
|
||||||
path: example/ios/Pods
|
|
||||||
key: pods-${{ hashFiles('**/Podfile.lock') }}
|
|
||||||
|
|
||||||
- name: Update Pods
|
|
||||||
run: |
|
|
||||||
gem update cocoapods xcodeproj
|
|
||||||
cd example/ios
|
|
||||||
pod install
|
|
||||||
|
|
||||||
- name: Configure dependencies
|
|
||||||
run: |
|
|
||||||
brew tap wix/brew
|
|
||||||
brew install applesimutils
|
|
||||||
yarn global add detox-cli
|
|
||||||
|
|
||||||
- name: Cache Detox build
|
|
||||||
uses: actions/cache@v1
|
|
||||||
id: detox-cache
|
|
||||||
with:
|
|
||||||
path: example/ios/build
|
|
||||||
key: detox-build-${{ hashFiles('**/yarn.lock') }}-${{ hashFiles('**/Podfile.lock') }}
|
|
||||||
|
|
||||||
- name: Build Detox
|
|
||||||
if: steps.detox-cache.outputs.cache-hit != 'true'
|
|
||||||
run: |
|
|
||||||
cd example
|
|
||||||
detox build --configuration ios.sim.release
|
|
||||||
|
|
||||||
- name: Run Detox tests
|
|
||||||
run: |
|
|
||||||
cd example
|
|
||||||
detox test --configuration ios.sim.release --cleanup --debug-synchronization 200
|
|
||||||
27
.github/workflows/rebase.yml
vendored
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
name: Automatic Rebase
|
||||||
|
on:
|
||||||
|
issue_comment:
|
||||||
|
types: [created]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
rebase:
|
||||||
|
name: Rebase
|
||||||
|
if: github.event.issue.pull_request != '' && contains(github.event.comment.body, '/rebase')
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@master
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
|
||||||
|
- name: Automatic Rebase
|
||||||
|
uses: cirrus-actions/rebase@1.2
|
||||||
|
env:
|
||||||
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|
||||||
|
# https://github.community/t5/GitHub-Actions/Workflow-is-failing-if-no-job-can-be-ran-due-to-condition/m-p/38186#M3250
|
||||||
|
always_job:
|
||||||
|
name: Always run job
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Always run
|
||||||
|
run: echo "This job is used to prevent the workflow to fail when all other jobs are skipped."
|
||||||
38
README.md
@@ -41,12 +41,12 @@ Remember to add tests for your change if possible. Run the unit tests by:
|
|||||||
yarn test
|
yarn test
|
||||||
```
|
```
|
||||||
|
|
||||||
Running Detox (on iOS) requires the following:
|
Running the e2e tests with Detox (on iOS) requires the following:
|
||||||
|
|
||||||
- Mac with macOS (at least macOS High Sierra 10.13.6)
|
- Mac with macOS (at least macOS High Sierra 10.13.6)
|
||||||
- Xcode 10.1+ with Xcode command line tools
|
- Xcode 10.1+ with Xcode command line tools
|
||||||
|
|
||||||
To run the integration tests, first you need to install `applesimutils` and `detox-cli`:
|
First you need to install `applesimutils` and `detox-cli`:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
brew tap wix/brew
|
brew tap wix/brew
|
||||||
@@ -57,7 +57,6 @@ yarn global add detox-cli
|
|||||||
Then you can build and run the tests:
|
Then you can build and run the tests:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
cd example
|
|
||||||
detox build -c ios.sim.debug
|
detox build -c ios.sim.debug
|
||||||
detox test -c ios.sim.debug
|
detox test -c ios.sim.debug
|
||||||
```
|
```
|
||||||
@@ -72,6 +71,39 @@ yarn lerna publish
|
|||||||
|
|
||||||
This will automatically bump the version and publish the packages. It'll also publish the changelogs on GitHub for each package.
|
This will automatically bump the version and publish the packages. It'll also publish the changelogs on GitHub for each package.
|
||||||
|
|
||||||
|
## Installing from a fork on GitHub
|
||||||
|
|
||||||
|
Since we use a monorepo, it's not possible to install a package from the repository URL. If you need to install a forked version from Git, you can use [`gitpkg`](https://github.com/ramasilveyra/gitpkg).
|
||||||
|
|
||||||
|
First install `gitpkg`:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
yarn global add gitpkg
|
||||||
|
```
|
||||||
|
|
||||||
|
Then follow these steps to publish and install a forked package:
|
||||||
|
|
||||||
|
1. Fork this repo to your account and clone the forked repo to your local machine
|
||||||
|
1. Open a Terminal and `cd` to the location of the cloned repo
|
||||||
|
1. Run `yarn` to install any dependencies
|
||||||
|
1. If you want to make any changes, make them and commit
|
||||||
|
1. Now `cd` to the package directory that you want to use (e.g. `cd packages/stack` for `@react-navigation/stack`)
|
||||||
|
1. Run `gitpkg publish` to publish the package to your repo
|
||||||
|
|
||||||
|
After publishing, you should see something like this:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
Package uploaded to git@github.com:<user>/<repo>.git with the name <name>
|
||||||
|
```
|
||||||
|
|
||||||
|
You can now install the dependency in your project:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
yarn add <user>/<repo>.git#<name>
|
||||||
|
```
|
||||||
|
|
||||||
|
Remember to replace `<user>`, `<repo>` and `<name>` with right values.
|
||||||
|
|
||||||
<!-- badges -->
|
<!-- badges -->
|
||||||
|
|
||||||
[build-badge]: https://img.shields.io/circleci/project/github/react-navigation/navigation-ex/master.svg?style=flat-square
|
[build-badge]: https://img.shields.io/circleci/project/github/react-navigation/navigation-ex/master.svg?style=flat-square
|
||||||
|
|||||||
@@ -16,5 +16,7 @@ module.exports = {
|
|||||||
plugins: [
|
plugins: [
|
||||||
'@babel/plugin-proposal-class-properties',
|
'@babel/plugin-proposal-class-properties',
|
||||||
'@babel/plugin-proposal-optional-chaining',
|
'@babel/plugin-proposal-optional-chaining',
|
||||||
|
'@babel/transform-flow-strip-types',
|
||||||
|
'@babel/plugin-proposal-nullish-coalescing-operator',
|
||||||
],
|
],
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,3 +1,6 @@
|
|||||||
import 'react-native-gesture-handler';
|
import 'react-native-gesture-handler';
|
||||||
|
import { registerRootComponent } from 'expo';
|
||||||
|
|
||||||
export { default } from './src/index';
|
import App from './src/index';
|
||||||
|
|
||||||
|
registerRootComponent(App);
|
||||||
|
|||||||
@@ -5,3 +5,5 @@ If you want to run the example from the repo,
|
|||||||
- Clone the repository and run `yarn` in the project root
|
- Clone the repository and run `yarn` in the project root
|
||||||
- Run `yarn example start` to start the packager
|
- Run `yarn example start` to start the packager
|
||||||
- Follow the instructions to open it with the [Expo app](https://expo.io/)
|
- Follow the instructions to open it with the [Expo app](https://expo.io/)
|
||||||
|
|
||||||
|
You can also run the currently published [app on Expo](https://expo.io/@react-navigation/react-navigation-example) on your Android device or iOS simulator or the [web app](https://react-navigation-example.netlify.com/) in your browser.
|
||||||
|
|||||||
@@ -4,8 +4,8 @@
|
|||||||
<facet type="android-gradle" name="Android-Gradle">
|
<facet type="android-gradle" name="Android-Gradle">
|
||||||
<configuration>
|
<configuration>
|
||||||
<option name="GRADLE_PROJECT_PATH" value=":app" />
|
<option name="GRADLE_PROJECT_PATH" value=":app" />
|
||||||
<option name="LAST_SUCCESSFUL_SYNC_AGP_VERSION" value="3.3.0" />
|
<option name="LAST_SUCCESSFUL_SYNC_AGP_VERSION" value="3.4.2" />
|
||||||
<option name="LAST_KNOWN_AGP_VERSION" value="3.3.0" />
|
<option name="LAST_KNOWN_AGP_VERSION" value="3.4.2" />
|
||||||
</configuration>
|
</configuration>
|
||||||
</facet>
|
</facet>
|
||||||
<facet type="android" name="Android">
|
<facet type="android" name="Android">
|
||||||
@@ -19,8 +19,8 @@
|
|||||||
<option name="ALLOW_USER_CONFIGURATION" value="false" />
|
<option name="ALLOW_USER_CONFIGURATION" value="false" />
|
||||||
<option name="MANIFEST_FILE_RELATIVE_PATH" value="/src/main/AndroidManifest.xml" />
|
<option name="MANIFEST_FILE_RELATIVE_PATH" value="/src/main/AndroidManifest.xml" />
|
||||||
<option name="RES_FOLDER_RELATIVE_PATH" value="/src/main/res" />
|
<option name="RES_FOLDER_RELATIVE_PATH" value="/src/main/res" />
|
||||||
<option name="RES_FOLDERS_RELATIVE_PATH" value="file://$MODULE_DIR$/src/main/res;file://$MODULE_DIR$/build/generated/res/rs/debug;file://$MODULE_DIR$/build/generated/res/resValues/debug" />
|
<option name="RES_FOLDERS_RELATIVE_PATH" value="file://$MODULE_DIR$/src/main/res;file://$MODULE_DIR$/build/generated/res/resValues/debug" />
|
||||||
<option name="TEST_RES_FOLDERS_RELATIVE_PATH" value="file://$MODULE_DIR$/build/generated/res/rs/androidTest/debug" />
|
<option name="TEST_RES_FOLDERS_RELATIVE_PATH" value="" />
|
||||||
<option name="ASSETS_FOLDER_RELATIVE_PATH" value="/src/main/assets" />
|
<option name="ASSETS_FOLDER_RELATIVE_PATH" value="/src/main/assets" />
|
||||||
</configuration>
|
</configuration>
|
||||||
</facet>
|
</facet>
|
||||||
@@ -70,6 +70,7 @@
|
|||||||
<sourceFolder url="file://$MODULE_DIR$/src/main/assets" type="java-resource" />
|
<sourceFolder url="file://$MODULE_DIR$/src/main/assets" type="java-resource" />
|
||||||
<sourceFolder url="file://$MODULE_DIR$/src/main/aidl" isTestSource="false" />
|
<sourceFolder url="file://$MODULE_DIR$/src/main/aidl" isTestSource="false" />
|
||||||
<sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
|
<sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
|
||||||
|
<sourceFolder url="file://$MODULE_DIR$/build/generated/rncli/src/main/java" isTestSource="false" />
|
||||||
<sourceFolder url="file://$MODULE_DIR$/src/main/rs" isTestSource="false" />
|
<sourceFolder url="file://$MODULE_DIR$/src/main/rs" isTestSource="false" />
|
||||||
<sourceFolder url="file://$MODULE_DIR$/src/main/shaders" isTestSource="false" />
|
<sourceFolder url="file://$MODULE_DIR$/src/main/shaders" isTestSource="false" />
|
||||||
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/res" type="java-test-resource" />
|
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/res" type="java-test-resource" />
|
||||||
@@ -90,91 +91,103 @@
|
|||||||
</content>
|
</content>
|
||||||
<orderEntry type="jdk" jdkName="Android API 28 Platform" jdkType="Android SDK" />
|
<orderEntry type="jdk" jdkName="Android API 28 Platform" jdkType="Android SDK" />
|
||||||
<orderEntry type="sourceFolder" forTests="false" />
|
<orderEntry type="sourceFolder" forTests="false" />
|
||||||
<orderEntry type="library" name="Gradle: com.android.support:collections:28.0.0@jar" level="project" />
|
|
||||||
<orderEntry type="library" name="Gradle: android.arch.lifecycle:common:1.1.1@jar" level="project" />
|
|
||||||
<orderEntry type="library" name="Gradle: android.arch.core:common:1.1.1@jar" level="project" />
|
|
||||||
<orderEntry type="library" name="Gradle: com.android.support:support-annotations:28.0.0@jar" level="project" />
|
|
||||||
<orderEntry type="library" name="Gradle: com.facebook.infer.annotation:infer-annotation:0.11.2@jar" level="project" />
|
<orderEntry type="library" name="Gradle: com.facebook.infer.annotation:infer-annotation:0.11.2@jar" level="project" />
|
||||||
<orderEntry type="library" name="Gradle: javax.inject:javax.inject:1@jar" level="project" />
|
|
||||||
<orderEntry type="library" name="Gradle: com.google.code.findbugs:jsr305:3.0.2@jar" level="project" />
|
<orderEntry type="library" name="Gradle: com.google.code.findbugs:jsr305:3.0.2@jar" level="project" />
|
||||||
|
<orderEntry type="library" name="Gradle: javax.inject:javax.inject:1@jar" level="project" />
|
||||||
|
<orderEntry type="library" name="Gradle: androidx.collection:collection:1.1.0@jar" level="project" />
|
||||||
|
<orderEntry type="library" name="Gradle: androidx.lifecycle:lifecycle-common:2.1.0@jar" level="project" />
|
||||||
|
<orderEntry type="library" name="Gradle: androidx.arch.core:core-common:2.1.0@jar" level="project" />
|
||||||
|
<orderEntry type="library" name="Gradle: androidx.annotation:annotation:1.1.0@jar" level="project" />
|
||||||
<orderEntry type="library" name="Gradle: com.squareup.okhttp3:okhttp-urlconnection:3.12.1@jar" level="project" />
|
<orderEntry type="library" name="Gradle: com.squareup.okhttp3:okhttp-urlconnection:3.12.1@jar" level="project" />
|
||||||
<orderEntry type="library" name="Gradle: com.squareup.okhttp3:okhttp:3.12.1@jar" level="project" />
|
<orderEntry type="library" name="Gradle: com.squareup.okhttp3:okhttp:3.12.1@jar" level="project" />
|
||||||
<orderEntry type="library" name="Gradle: com.squareup.okio:okio:1.15.0@jar" level="project" />
|
<orderEntry type="library" name="Gradle: com.squareup.okio:okio:1.15.0@jar" level="project" />
|
||||||
|
<orderEntry type="library" name="Gradle: com.github.bumptech.glide:disklrucache:4.9.0@jar" level="project" />
|
||||||
|
<orderEntry type="library" name="Gradle: com.github.bumptech.glide:annotations:4.9.0@jar" level="project" />
|
||||||
|
<orderEntry type="library" name="Gradle: org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.3.41@jar" level="project" />
|
||||||
|
<orderEntry type="library" name="Gradle: org.jetbrains.kotlin:kotlin-stdlib:1.3.41@jar" level="project" />
|
||||||
|
<orderEntry type="library" name="Gradle: org.jetbrains.kotlin:kotlin-stdlib-common:1.3.41@jar" level="project" />
|
||||||
|
<orderEntry type="library" name="Gradle: org.jetbrains:annotations:13.0@jar" level="project" />
|
||||||
<orderEntry type="library" name="Gradle: com.facebook.device.yearclass:yearclass:2.1.0@jar" level="project" />
|
<orderEntry type="library" name="Gradle: com.facebook.device.yearclass:yearclass:2.1.0@jar" level="project" />
|
||||||
<orderEntry type="library" name="Gradle: commons-codec:commons-codec:1.10@jar" level="project" />
|
<orderEntry type="library" name="Gradle: commons-codec:commons-codec:1.10@jar" level="project" />
|
||||||
<orderEntry type="library" name="Gradle: commons-io:commons-io:1.4@jar" level="project" />
|
<orderEntry type="library" name="Gradle: commons-io:commons-io:1.4@jar" level="project" />
|
||||||
<orderEntry type="library" name="Gradle: com.github.bumptech.glide:disklrucache:4.9.0@jar" level="project" />
|
|
||||||
<orderEntry type="library" name="Gradle: com.github.bumptech.glide:annotations:4.9.0@jar" level="project" />
|
|
||||||
<orderEntry type="library" name="Gradle: com.parse.bolts:bolts-tasks:1.4.0@jar" level="project" />
|
|
||||||
<orderEntry type="library" name="Gradle: com.facebook.react:react-native:0.61.5@aar" level="project" />
|
<orderEntry type="library" name="Gradle: com.facebook.react:react-native:0.61.5@aar" level="project" />
|
||||||
<orderEntry type="library" name="Gradle: com.android.support:appcompat-v7:28.0.0@aar" level="project" />
|
<orderEntry type="library" name="Gradle: androidx.appcompat:appcompat:1.1.0@aar" level="project" />
|
||||||
|
<orderEntry type="library" name="Gradle: androidx.browser:browser:1.0.0@aar" level="project" />
|
||||||
<orderEntry type="library" name="Gradle: com.github.bumptech.glide:glide:4.9.0@aar" level="project" />
|
<orderEntry type="library" name="Gradle: com.github.bumptech.glide:glide:4.9.0@aar" level="project" />
|
||||||
|
<orderEntry type="library" name="Gradle: com.github.bumptech.glide:gifdecoder:4.9.0@aar" level="project" />
|
||||||
<orderEntry type="library" name="Gradle: com.google.android.gms:play-services-location:16.0.0@aar" level="project" />
|
<orderEntry type="library" name="Gradle: com.google.android.gms:play-services-location:16.0.0@aar" level="project" />
|
||||||
<orderEntry type="library" name="Gradle: com.google.android.gms:play-services-base:16.0.1@aar" level="project" />
|
<orderEntry type="library" name="Gradle: com.google.android.gms:play-services-base:16.0.1@aar" level="project" />
|
||||||
<orderEntry type="library" name="Gradle: com.google.android.gms:play-services-places-placereport:16.0.0@aar" level="project" />
|
<orderEntry type="library" name="Gradle: com.google.android.gms:play-services-places-placereport:16.0.0@aar" level="project" />
|
||||||
<orderEntry type="library" name="Gradle: com.google.android.gms:play-services-tasks:16.0.1@aar" level="project" />
|
<orderEntry type="library" name="Gradle: com.google.android.gms:play-services-tasks:16.0.1@aar" level="project" />
|
||||||
<orderEntry type="library" name="Gradle: com.google.android.gms:play-services-basement:16.0.1@aar" level="project" />
|
<orderEntry type="library" name="Gradle: com.google.android.gms:play-services-basement:16.0.1@aar" level="project" />
|
||||||
<orderEntry type="library" name="Gradle: com.android.support:support-v4:28.0.0@aar" level="project" />
|
<orderEntry type="library" name="Gradle: androidx.legacy:legacy-support-v4:1.0.0@aar" level="project" />
|
||||||
<orderEntry type="library" name="Gradle: com.android.support:support-fragment:28.0.0@aar" level="project" />
|
<orderEntry type="library" name="Gradle: androidx.fragment:fragment:1.1.0@aar" level="project" />
|
||||||
<orderEntry type="library" name="Gradle: com.android.support:animated-vector-drawable:28.0.0@aar" level="project" />
|
<orderEntry type="library" name="Gradle: androidx.media:media:1.0.0@aar" level="project" />
|
||||||
<orderEntry type="library" name="Gradle: com.android.support:customtabs:28.0.0@aar" level="project" />
|
<orderEntry type="library" name="Gradle: androidx.legacy:legacy-support-core-ui:1.0.0@aar" level="project" />
|
||||||
<orderEntry type="library" name="Gradle: com.android.support:support-core-ui:28.0.0@aar" level="project" />
|
<orderEntry type="library" name="Gradle: androidx.legacy:legacy-support-core-utils:1.0.0@aar" level="project" />
|
||||||
<orderEntry type="library" name="Gradle: com.android.support:support-core-utils:28.0.0@aar" level="project" />
|
<orderEntry type="library" name="Gradle: androidx.appcompat:appcompat-resources:1.1.0@aar" level="project" />
|
||||||
<orderEntry type="library" name="Gradle: com.android.support:support-vector-drawable:28.0.0@aar" level="project" />
|
<orderEntry type="library" name="Gradle: androidx.drawerlayout:drawerlayout:1.0.0@aar" level="project" />
|
||||||
<orderEntry type="library" name="Gradle: com.android.support:loader:28.0.0@aar" level="project" />
|
<orderEntry type="library" name="Gradle: androidx.viewpager:viewpager:1.0.0@aar" level="project" />
|
||||||
<orderEntry type="library" name="Gradle: com.android.support:support-media-compat:28.0.0@aar" level="project" />
|
<orderEntry type="library" name="Gradle: androidx.loader:loader:1.0.0@aar" level="project" />
|
||||||
<orderEntry type="library" name="Gradle: com.android.support:viewpager:28.0.0@aar" level="project" />
|
<orderEntry type="library" name="Gradle: androidx.activity:activity:1.0.0@aar" level="project" />
|
||||||
<orderEntry type="library" name="Gradle: com.android.support:coordinatorlayout:28.0.0@aar" level="project" />
|
<orderEntry type="library" name="Gradle: androidx.vectordrawable:vectordrawable-animated:1.1.0@aar" level="project" />
|
||||||
<orderEntry type="library" name="Gradle: com.android.support:drawerlayout:28.0.0@aar" level="project" />
|
<orderEntry type="library" name="Gradle: androidx.vectordrawable:vectordrawable:1.1.0@aar" level="project" />
|
||||||
<orderEntry type="library" name="Gradle: com.android.support:slidingpanelayout:28.0.0@aar" level="project" />
|
<orderEntry type="library" name="Gradle: androidx.coordinatorlayout:coordinatorlayout:1.0.0@aar" level="project" />
|
||||||
<orderEntry type="library" name="Gradle: com.android.support:customview:28.0.0@aar" level="project" />
|
<orderEntry type="library" name="Gradle: androidx.slidingpanelayout:slidingpanelayout:1.0.0@aar" level="project" />
|
||||||
<orderEntry type="library" name="Gradle: com.android.support:swiperefreshlayout:28.0.0@aar" level="project" />
|
<orderEntry type="library" name="Gradle: androidx.customview:customview:1.0.0@aar" level="project" />
|
||||||
<orderEntry type="library" name="Gradle: com.android.support:asynclayoutinflater:28.0.0@aar" level="project" />
|
<orderEntry type="library" name="Gradle: androidx.swiperefreshlayout:swiperefreshlayout:1.0.0@aar" level="project" />
|
||||||
<orderEntry type="library" name="Gradle: com.android.support:support-compat:28.0.0@aar" level="project" />
|
<orderEntry type="library" name="Gradle: androidx.asynclayoutinflater:asynclayoutinflater:1.0.0@aar" level="project" />
|
||||||
<orderEntry type="library" name="Gradle: com.android.support:versionedparcelable:28.0.0@aar" level="project" />
|
<orderEntry type="library" name="Gradle: androidx.core:core:1.1.0@aar" level="project" />
|
||||||
<orderEntry type="library" name="Gradle: com.android.support:cursoradapter:28.0.0@aar" level="project" />
|
<orderEntry type="library" name="Gradle: androidx.cursoradapter:cursoradapter:1.0.0@aar" level="project" />
|
||||||
<orderEntry type="library" name="Gradle: android.arch.lifecycle:runtime:1.1.1@aar" level="project" />
|
<orderEntry type="library" name="Gradle: androidx.versionedparcelable:versionedparcelable:1.1.0@aar" level="project" />
|
||||||
<orderEntry type="library" name="Gradle: com.android.support:documentfile:28.0.0@aar" level="project" />
|
<orderEntry type="library" name="Gradle: androidx.interpolator:interpolator:1.0.0@aar" level="project" />
|
||||||
<orderEntry type="library" name="Gradle: com.android.support:localbroadcastmanager:28.0.0@aar" level="project" />
|
<orderEntry type="library" name="Gradle: androidx.lifecycle:lifecycle-viewmodel:2.1.0@aar" level="project" />
|
||||||
<orderEntry type="library" name="Gradle: com.android.support:print:28.0.0@aar" level="project" />
|
<orderEntry type="library" name="Gradle: androidx.lifecycle:lifecycle-runtime:2.1.0@aar" level="project" />
|
||||||
<orderEntry type="library" name="Gradle: android.arch.lifecycle:viewmodel:1.1.1@aar" level="project" />
|
<orderEntry type="library" name="Gradle: androidx.documentfile:documentfile:1.0.0@aar" level="project" />
|
||||||
<orderEntry type="library" name="Gradle: com.github.bumptech.glide:gifdecoder:4.9.0@aar" level="project" />
|
<orderEntry type="library" name="Gradle: androidx.localbroadcastmanager:localbroadcastmanager:1.0.0@aar" level="project" />
|
||||||
<orderEntry type="library" name="Gradle: com.android.support:interpolator:28.0.0@aar" level="project" />
|
<orderEntry type="library" name="Gradle: androidx.print:print:1.0.0@aar" level="project" />
|
||||||
<orderEntry type="library" name="Gradle: android.arch.lifecycle:livedata:1.1.1@aar" level="project" />
|
<orderEntry type="library" name="Gradle: androidx.savedstate:savedstate:1.0.0@aar" level="project" />
|
||||||
<orderEntry type="library" name="Gradle: android.arch.lifecycle:livedata-core:1.1.1@aar" level="project" />
|
<orderEntry type="library" name="Gradle: androidx.lifecycle:lifecycle-livedata:2.0.0@aar" level="project" />
|
||||||
<orderEntry type="library" name="Gradle: android.arch.core:runtime:1.1.1@aar" level="project" />
|
<orderEntry type="library" name="Gradle: androidx.lifecycle:lifecycle-livedata-core:2.0.0@aar" level="project" />
|
||||||
<orderEntry type="library" name="Gradle: com.facebook.fresco:fresco:1.10.0@aar" level="project" />
|
<orderEntry type="library" name="Gradle: androidx.arch.core:core-runtime:2.0.0@aar" level="project" />
|
||||||
<orderEntry type="library" name="Gradle: com.facebook.fresco:imagepipeline-okhttp3:1.10.0@aar" level="project" />
|
<orderEntry type="library" name="Gradle: com.facebook.fresco:fresco:2.0.0@aar" level="project" />
|
||||||
<orderEntry type="library" name="Gradle: com.facebook.fresco:drawee:1.10.0@aar" level="project" />
|
<orderEntry type="library" name="Gradle: com.facebook.fresco:fbcore:2.0.0@aar" level="project" />
|
||||||
<orderEntry type="library" name="Gradle: com.facebook.fresco:imagepipeline:1.10.0@aar" level="project" />
|
<orderEntry type="library" name="Gradle: com.facebook.fresco:drawee:2.0.0@aar" level="project" />
|
||||||
<orderEntry type="library" name="Gradle: com.facebook.fresco:imagepipeline-base:1.10.0@aar" level="project" />
|
<orderEntry type="library" name="Gradle: com.facebook.fresco:imagepipeline:2.0.0@aar" level="project" />
|
||||||
|
<orderEntry type="library" name="Gradle: com.facebook.fresco:imagepipeline-base:2.0.0@aar" level="project" />
|
||||||
<orderEntry type="library" name="Gradle: com.facebook.soloader:soloader:0.6.0@aar" level="project" />
|
<orderEntry type="library" name="Gradle: com.facebook.soloader:soloader:0.6.0@aar" level="project" />
|
||||||
|
<orderEntry type="library" name="Gradle: com.facebook.fresco:nativeimagefilters:2.0.0@aar" level="project" />
|
||||||
|
<orderEntry type="library" name="Gradle: com.facebook.fresco:nativeimagetranscoder:2.0.0@aar" level="project" />
|
||||||
|
<orderEntry type="library" name="Gradle: com.facebook.fresco:imagepipeline-okhttp3:2.0.0@aar" level="project" />
|
||||||
<orderEntry type="library" name="Gradle: io.nlopez.smartlocation:library:3.2.11@aar" level="project" />
|
<orderEntry type="library" name="Gradle: io.nlopez.smartlocation:library:3.2.11@aar" level="project" />
|
||||||
<orderEntry type="library" name="Gradle: com.facebook.fresco:fbcore:1.10.0@aar" level="project" />
|
<orderEntry type="library" name="Gradle: org.webkit:android-jsc:r245459@aar" level="project" />
|
||||||
|
<orderEntry type="module" module-name="android-expo-permissions" />
|
||||||
|
<orderEntry type="module" module-name="android-expo-constants" />
|
||||||
|
<orderEntry type="module" module-name="android-unimodules-image-loader-interface" />
|
||||||
|
<orderEntry type="module" module-name="android-expo-web-browser" />
|
||||||
|
<orderEntry type="module" module-name="android-unimodules-react-native-adapter" />
|
||||||
|
<orderEntry type="module" module-name="android-expo-file-system" />
|
||||||
|
<orderEntry type="module" module-name="android-expo-location" />
|
||||||
|
<orderEntry type="module" module-name="android-expo-error-recovery" />
|
||||||
|
<orderEntry type="module" module-name="android-unimodules-permissions-interface" />
|
||||||
|
<orderEntry type="module" module-name="android-unimodules-core" />
|
||||||
|
<orderEntry type="module" module-name="android-expo-app-loader-provider" />
|
||||||
|
<orderEntry type="module" module-name="android-expo-font" />
|
||||||
|
<orderEntry type="module" module-name="android-expo-keep-awake" />
|
||||||
|
<orderEntry type="module" module-name="android-expo-linear-gradient" />
|
||||||
|
<orderEntry type="module" module-name="android-expo-sqlite" />
|
||||||
|
<orderEntry type="module" module-name="android-unimodules-barcode-scanner-interface" />
|
||||||
|
<orderEntry type="module" module-name="android-unimodules-camera-interface" />
|
||||||
|
<orderEntry type="module" module-name="android-unimodules-constants-interface" />
|
||||||
|
<orderEntry type="module" module-name="android-unimodules-face-detector-interface" />
|
||||||
|
<orderEntry type="module" module-name="android-unimodules-file-system-interface" />
|
||||||
|
<orderEntry type="module" module-name="android-unimodules-font-interface" />
|
||||||
|
<orderEntry type="module" module-name="android-unimodules-sensors-interface" />
|
||||||
|
<orderEntry type="module" module-name="android-unimodules-task-manager-interface" />
|
||||||
|
<orderEntry type="module" module-name="android-@react-native-community_masked-view" />
|
||||||
|
<orderEntry type="module" module-name="android-react-native-gesture-handler" />
|
||||||
|
<orderEntry type="module" module-name="android-react-native-reanimated" />
|
||||||
|
<orderEntry type="module" module-name="react-native-safe-area-context" />
|
||||||
<orderEntry type="module" module-name="react-native-screens" />
|
<orderEntry type="module" module-name="react-native-screens" />
|
||||||
<orderEntry type="module" module-name="react-native-reanimated" />
|
|
||||||
<orderEntry type="module" module-name="react-native-gesture-handler" />
|
|
||||||
<orderEntry type="module" module-name="expo-permissions" />
|
|
||||||
<orderEntry type="module" module-name="unimodules-core" />
|
|
||||||
<orderEntry type="module" module-name="unimodules-react-native-adapter" />
|
|
||||||
<orderEntry type="module" module-name="expo-app-loader-provider" />
|
|
||||||
<orderEntry type="module" module-name="expo-constants" />
|
|
||||||
<orderEntry type="module" module-name="expo-file-system" />
|
|
||||||
<orderEntry type="module" module-name="expo-font" />
|
|
||||||
<orderEntry type="module" module-name="expo-keep-awake" />
|
|
||||||
<orderEntry type="module" module-name="expo-linear-gradient" />
|
|
||||||
<orderEntry type="module" module-name="expo-location" />
|
|
||||||
<orderEntry type="module" module-name="expo-sqlite" />
|
|
||||||
<orderEntry type="module" module-name="expo-web-browser" />
|
|
||||||
<orderEntry type="module" module-name="unimodules-barcode-scanner-interface" />
|
|
||||||
<orderEntry type="module" module-name="unimodules-camera-interface" />
|
|
||||||
<orderEntry type="module" module-name="unimodules-constants-interface" />
|
|
||||||
<orderEntry type="module" module-name="unimodules-face-detector-interface" />
|
|
||||||
<orderEntry type="module" module-name="unimodules-file-system-interface" />
|
|
||||||
<orderEntry type="module" module-name="unimodules-font-interface" />
|
|
||||||
<orderEntry type="module" module-name="unimodules-image-loader-interface" />
|
|
||||||
<orderEntry type="module" module-name="unimodules-permissions-interface" />
|
|
||||||
<orderEntry type="module" module-name="unimodules-sensors-interface" />
|
|
||||||
<orderEntry type="module" module-name="unimodules-task-manager-interface" />
|
|
||||||
</component>
|
</component>
|
||||||
</module>
|
</module>
|
||||||
@@ -80,8 +80,8 @@ project.ext.react = [
|
|||||||
enableHermes: false, // clean and rebuild if changing
|
enableHermes: false, // clean and rebuild if changing
|
||||||
]
|
]
|
||||||
|
|
||||||
apply from: '../../node_modules/react-native-unimodules/gradle.groovy'
|
apply from: '../../../node_modules/react-native-unimodules/gradle.groovy'
|
||||||
apply from: "../../node_modules/react-native/react.gradle"
|
apply from: "../../../node_modules/react-native/react.gradle"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set this to true to create two separate APKs instead of one:
|
* Set this to true to create two separate APKs instead of one:
|
||||||
@@ -179,10 +179,10 @@ android {
|
|||||||
dependencies {
|
dependencies {
|
||||||
implementation fileTree(dir: "libs", include: ["*.jar"])
|
implementation fileTree(dir: "libs", include: ["*.jar"])
|
||||||
implementation "com.facebook.react:react-native:+" // From node_modules
|
implementation "com.facebook.react:react-native:+" // From node_modules
|
||||||
addUnimodulesDependencies()
|
addUnimodulesDependencies([ modulesPaths : ['../../../node_modules'] ])
|
||||||
|
|
||||||
if (enableHermes) {
|
if (enableHermes) {
|
||||||
def hermesPath = "../../node_modules/hermes-engine/android/";
|
def hermesPath = "../../../node_modules/hermes-engine/android/";
|
||||||
debugImplementation files(hermesPath + "hermes-debug.aar")
|
debugImplementation files(hermesPath + "hermes-debug.aar")
|
||||||
releaseImplementation files(hermesPath + "hermes-release.aar")
|
releaseImplementation files(hermesPath + "hermes-release.aar")
|
||||||
} else {
|
} else {
|
||||||
@@ -197,4 +197,4 @@ task copyDownloadableDepsToLibs(type: Copy) {
|
|||||||
into 'libs'
|
into 'libs'
|
||||||
}
|
}
|
||||||
|
|
||||||
apply from: file("../../node_modules/@react-native-community/cli-platform-android/native_modules.gradle"); applyNativeModulesAppBuildGradle(project)
|
apply from: file("../../../node_modules/@react-native-community/cli-platform-android/native_modules.gradle"); applyNativeModulesAppBuildGradle(project)
|
||||||
|
|||||||
@@ -36,12 +36,19 @@
|
|||||||
<activity
|
<activity
|
||||||
android:name=".MainActivity"
|
android:name=".MainActivity"
|
||||||
android:label="@string/app_name"
|
android:label="@string/app_name"
|
||||||
|
android:launchMode="singleTask"
|
||||||
android:configChanges="keyboard|keyboardHidden|orientation|screenSize"
|
android:configChanges="keyboard|keyboardHidden|orientation|screenSize"
|
||||||
android:windowSoftInputMode="adjustResize">
|
android:windowSoftInputMode="adjustResize">
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
<action android:name="android.intent.action.MAIN" />
|
<action android:name="android.intent.action.MAIN" />
|
||||||
<category android:name="android.intent.category.LAUNCHER" />
|
<category android:name="android.intent.category.LAUNCHER" />
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
|
<intent-filter>
|
||||||
|
<action android:name="android.intent.action.VIEW" />
|
||||||
|
<category android:name="android.intent.category.DEFAULT" />
|
||||||
|
<category android:name="android.intent.category.BROWSABLE" />
|
||||||
|
<data android:scheme="rne" />
|
||||||
|
</intent-filter>
|
||||||
</activity>
|
</activity>
|
||||||
<activity android:name="com.facebook.react.devsupport.DevSettingsActivity" />
|
<activity android:name="com.facebook.react.devsupport.DevSettingsActivity" />
|
||||||
</application>
|
</application>
|
||||||
|
|||||||
@@ -24,11 +24,11 @@ allprojects {
|
|||||||
mavenLocal()
|
mavenLocal()
|
||||||
maven {
|
maven {
|
||||||
// All of React Native (JS, Obj-C sources, Android binaries) is installed from npm
|
// All of React Native (JS, Obj-C sources, Android binaries) is installed from npm
|
||||||
url("$rootDir/../node_modules/react-native/android")
|
url("$rootDir/../../node_modules/react-native/android")
|
||||||
}
|
}
|
||||||
maven {
|
maven {
|
||||||
// Android JSC is installed from npm
|
// Android JSC is installed from npm
|
||||||
url("$rootDir/../node_modules/jsc-android/dist")
|
url("$rootDir/../../node_modules/jsc-android/dist")
|
||||||
}
|
}
|
||||||
|
|
||||||
google()
|
google()
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
apply from: '../node_modules/react-native-unimodules/gradle.groovy'
|
apply from: '../../node_modules/react-native-unimodules/gradle.groovy'
|
||||||
includeUnimodulesProjects()
|
includeUnimodulesProjects([ modulesPaths : ['../../../node_modules'] ])
|
||||||
|
|
||||||
|
|
||||||
rootProject.name = 'ReactNavigationExample'
|
rootProject.name = 'ReactNavigationExample'
|
||||||
apply from: file("../node_modules/@react-native-community/cli-platform-android/native_modules.gradle"); applyNativeModulesSettingsGradle(settings)
|
apply from: file("../../node_modules/@react-native-community/cli-platform-android/native_modules.gradle"); applyNativeModulesSettingsGradle(settings)
|
||||||
include ':app'
|
include ':app'
|
||||||
|
|||||||
@@ -1,7 +1,11 @@
|
|||||||
{
|
{
|
||||||
|
"name": "ReactNavigationExample",
|
||||||
|
"displayName": "React Navigation Example",
|
||||||
"expo": {
|
"expo": {
|
||||||
"name": "@react-navigation/example",
|
"name": "@react-navigation/example",
|
||||||
|
"owner": "react-navigation",
|
||||||
"slug": "react-navigation-example",
|
"slug": "react-navigation-example",
|
||||||
|
"description": "Demo app to showcase various functionality of React Navigation",
|
||||||
"privacy": "public",
|
"privacy": "public",
|
||||||
"sdkVersion": "36.0.0",
|
"sdkVersion": "36.0.0",
|
||||||
"platforms": [
|
"platforms": [
|
||||||
@@ -25,9 +29,6 @@
|
|||||||
"ios": {
|
"ios": {
|
||||||
"supportsTablet": true
|
"supportsTablet": true
|
||||||
},
|
},
|
||||||
"entryPoint": "node_modules/expo/AppEntry.js",
|
"entryPoint": "App.tsx"
|
||||||
"description": "Demo app to showcase various functionality of React Navigation"
|
}
|
||||||
},
|
|
||||||
"displayName": "React Navigation Example",
|
|
||||||
"name": "ReactNavigationExample"
|
|
||||||
}
|
}
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 28 KiB After Width: | Height: | Size: 27 KiB |
|
Before Width: | Height: | Size: 20 KiB After Width: | Height: | Size: 20 KiB |
|
Before Width: | Height: | Size: 27 KiB After Width: | Height: | Size: 27 KiB |
BIN
example/assets/album-art-04.jpg
Normal file
|
After Width: | Height: | Size: 33 KiB |
BIN
example/assets/album-art-05.jpg
Normal file
|
After Width: | Height: | Size: 11 KiB |
BIN
example/assets/album-art-06.jpg
Normal file
|
After Width: | Height: | Size: 21 KiB |
BIN
example/assets/album-art-07.jpg
Normal file
|
After Width: | Height: | Size: 9.7 KiB |
BIN
example/assets/album-art-08.jpg
Normal file
|
After Width: | Height: | Size: 20 KiB |
BIN
example/assets/album-art-09.jpg
Normal file
|
After Width: | Height: | Size: 110 KiB |
BIN
example/assets/album-art-10.jpg
Normal file
|
After Width: | Height: | Size: 229 KiB |
BIN
example/assets/album-art-11.jpg
Normal file
|
After Width: | Height: | Size: 50 KiB |
BIN
example/assets/album-art-12.jpg
Normal file
|
After Width: | Height: | Size: 18 KiB |
BIN
example/assets/album-art-13.jpg
Normal file
|
After Width: | Height: | Size: 81 KiB |
BIN
example/assets/album-art-14.jpg
Normal file
|
After Width: | Height: | Size: 75 KiB |
BIN
example/assets/album-art-15.jpg
Normal file
|
After Width: | Height: | Size: 84 KiB |
BIN
example/assets/album-art-16.jpg
Normal file
|
After Width: | Height: | Size: 116 KiB |
BIN
example/assets/album-art-17.jpg
Normal file
|
After Width: | Height: | Size: 87 KiB |
BIN
example/assets/album-art-18.jpg
Normal file
|
After Width: | Height: | Size: 136 KiB |
BIN
example/assets/album-art-19.jpg
Normal file
|
After Width: | Height: | Size: 93 KiB |
BIN
example/assets/album-art-20.jpg
Normal file
|
After Width: | Height: | Size: 116 KiB |
BIN
example/assets/album-art-21.jpg
Normal file
|
After Width: | Height: | Size: 186 KiB |
BIN
example/assets/album-art-22.jpg
Normal file
|
After Width: | Height: | Size: 78 KiB |
BIN
example/assets/album-art-23.jpg
Normal file
|
After Width: | Height: | Size: 55 KiB |
BIN
example/assets/album-art-24.jpg
Normal file
|
After Width: | Height: | Size: 125 KiB |
|
Before Width: | Height: | Size: 33 KiB |
|
Before Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 22 KiB |
|
Before Width: | Height: | Size: 10 KiB |
|
Before Width: | Height: | Size: 21 KiB |
|
Before Width: | Height: | Size: 94 KiB After Width: | Height: | Size: 93 KiB |
|
Before Width: | Height: | Size: 900 B After Width: | Height: | Size: 683 B |
10
example/e2e/.eslintrc.json
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
{
|
||||||
|
"settings": {
|
||||||
|
"import/core-modules": [
|
||||||
|
"detox",
|
||||||
|
"detox/runners/jest/adapter",
|
||||||
|
"detox/runners/jest/specReporter"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"env": { "jest": true, "jasmine": true }
|
||||||
|
}
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"setupFilesAfterEnv": ["./init.js"],
|
"setupFilesAfterEnv": ["./init.js"],
|
||||||
"testEnvironment": "node",
|
"testEnvironment": "node",
|
||||||
"reporters": ["detox/runners/jest/streamlineReporter"],
|
"reporters": ["detox/runners/jest/streamlineReporter"],
|
||||||
"verbose": true
|
"verbose": true
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,8 +1,7 @@
|
|||||||
/* eslint-disable import/no-commonjs, jest/no-jasmine-globals */
|
/* eslint-disable jest/no-jasmine-globals, import/no-commonjs */
|
||||||
/* eslint-env jest, jasmine */
|
|
||||||
|
|
||||||
const detox = require('detox');
|
const detox = require('detox');
|
||||||
const config = require('../package.json').detox;
|
const config = require('../../package.json').detox;
|
||||||
const adapter = require('detox/runners/jest/adapter');
|
const adapter = require('detox/runners/jest/adapter');
|
||||||
const specReporter = require('detox/runners/jest/specReporter');
|
const specReporter = require('detox/runners/jest/specReporter');
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,4 @@
|
|||||||
import { AppRegistry } from 'react-native';
|
import { AppRegistry } from 'react-native';
|
||||||
|
import App from './src/index.tsx';
|
||||||
// Need to add extension or eslint confuses it with app.json
|
|
||||||
import App from './App.tsx';
|
|
||||||
|
|
||||||
AppRegistry.registerComponent('ReactNavigationExample', () => App);
|
AppRegistry.registerComponent('ReactNavigationExample', () => App);
|
||||||
|
|||||||
@@ -1,40 +1,40 @@
|
|||||||
platform :ios, '10.0'
|
platform :ios, '10.0'
|
||||||
require_relative '../node_modules/@react-native-community/cli-platform-ios/native_modules'
|
require_relative '../../node_modules/@react-native-community/cli-platform-ios/native_modules'
|
||||||
require_relative '../node_modules/react-native-unimodules/cocoapods.rb'
|
require_relative '../../node_modules/react-native-unimodules/cocoapods.rb'
|
||||||
|
|
||||||
target 'ReactNavigationExample' do
|
target 'ReactNavigationExample' do
|
||||||
# Pods for ReactNavigationExample
|
# Pods for ReactNavigationExample
|
||||||
pod 'FBLazyVector', :path => "../node_modules/react-native/Libraries/FBLazyVector"
|
pod 'FBLazyVector', :path => '../../node_modules/react-native/Libraries/FBLazyVector'
|
||||||
pod 'FBReactNativeSpec', :path => "../node_modules/react-native/Libraries/FBReactNativeSpec"
|
pod 'FBReactNativeSpec', :path => '../../node_modules/react-native/Libraries/FBReactNativeSpec'
|
||||||
pod 'RCTRequired', :path => "../node_modules/react-native/Libraries/RCTRequired"
|
pod 'RCTRequired', :path => '../../node_modules/react-native/Libraries/RCTRequired'
|
||||||
pod 'RCTTypeSafety', :path => "../node_modules/react-native/Libraries/TypeSafety"
|
pod 'RCTTypeSafety', :path => '../../node_modules/react-native/Libraries/TypeSafety'
|
||||||
pod 'React', :path => '../node_modules/react-native/'
|
pod 'React', :path => '../../node_modules/react-native/'
|
||||||
pod 'React-Core', :path => '../node_modules/react-native/'
|
pod 'React-Core', :path => '../../node_modules/react-native/'
|
||||||
pod 'React-CoreModules', :path => '../node_modules/react-native/React/CoreModules'
|
pod 'React-CoreModules', :path => '../../node_modules/react-native/React/CoreModules'
|
||||||
pod 'React-Core/DevSupport', :path => '../node_modules/react-native/'
|
pod 'React-Core/DevSupport', :path => '../../node_modules/react-native/'
|
||||||
pod 'React-RCTActionSheet', :path => '../node_modules/react-native/Libraries/ActionSheetIOS'
|
pod 'React-RCTActionSheet', :path => '../../node_modules/react-native/Libraries/ActionSheetIOS'
|
||||||
pod 'React-RCTAnimation', :path => '../node_modules/react-native/Libraries/NativeAnimation'
|
pod 'React-RCTAnimation', :path => '../../node_modules/react-native/Libraries/NativeAnimation'
|
||||||
pod 'React-RCTBlob', :path => '../node_modules/react-native/Libraries/Blob'
|
pod 'React-RCTBlob', :path => '../../node_modules/react-native/Libraries/Blob'
|
||||||
pod 'React-RCTImage', :path => '../node_modules/react-native/Libraries/Image'
|
pod 'React-RCTImage', :path => '../../node_modules/react-native/Libraries/Image'
|
||||||
pod 'React-RCTLinking', :path => '../node_modules/react-native/Libraries/LinkingIOS'
|
pod 'React-RCTLinking', :path => '../../node_modules/react-native/Libraries/LinkingIOS'
|
||||||
pod 'React-RCTNetwork', :path => '../node_modules/react-native/Libraries/Network'
|
pod 'React-RCTNetwork', :path => '../../node_modules/react-native/Libraries/Network'
|
||||||
pod 'React-RCTSettings', :path => '../node_modules/react-native/Libraries/Settings'
|
pod 'React-RCTSettings', :path => '../../node_modules/react-native/Libraries/Settings'
|
||||||
pod 'React-RCTText', :path => '../node_modules/react-native/Libraries/Text'
|
pod 'React-RCTText', :path => '../../node_modules/react-native/Libraries/Text'
|
||||||
pod 'React-RCTVibration', :path => '../node_modules/react-native/Libraries/Vibration'
|
pod 'React-RCTVibration', :path => '../../node_modules/react-native/Libraries/Vibration'
|
||||||
pod 'React-Core/RCTWebSocket', :path => '../node_modules/react-native/'
|
pod 'React-Core/RCTWebSocket', :path => '../../node_modules/react-native/'
|
||||||
|
|
||||||
pod 'React-cxxreact', :path => '../node_modules/react-native/ReactCommon/cxxreact'
|
pod 'React-cxxreact', :path => '../../node_modules/react-native/ReactCommon/cxxreact'
|
||||||
pod 'React-jsi', :path => '../node_modules/react-native/ReactCommon/jsi'
|
pod 'React-jsi', :path => '../../node_modules/react-native/ReactCommon/jsi'
|
||||||
pod 'React-jsiexecutor', :path => '../node_modules/react-native/ReactCommon/jsiexecutor'
|
pod 'React-jsiexecutor', :path => '../../node_modules/react-native/ReactCommon/jsiexecutor'
|
||||||
pod 'React-jsinspector', :path => '../node_modules/react-native/ReactCommon/jsinspector'
|
pod 'React-jsinspector', :path => '../../node_modules/react-native/ReactCommon/jsinspector'
|
||||||
pod 'ReactCommon/jscallinvoker', :path => "../node_modules/react-native/ReactCommon"
|
pod 'ReactCommon/jscallinvoker', :path => '../../node_modules/react-native/ReactCommon'
|
||||||
pod 'ReactCommon/turbomodule/core', :path => "../node_modules/react-native/ReactCommon"
|
pod 'ReactCommon/turbomodule/core', :path => '../../node_modules/react-native/ReactCommon'
|
||||||
pod 'Yoga', :path => '../node_modules/react-native/ReactCommon/yoga'
|
pod 'Yoga', :path => '../../node_modules/react-native/ReactCommon/yoga'
|
||||||
|
|
||||||
pod 'DoubleConversion', :podspec => '../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec'
|
pod 'DoubleConversion', :podspec => '../../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec'
|
||||||
pod 'glog', :podspec => '../node_modules/react-native/third-party-podspecs/glog.podspec'
|
pod 'glog', :podspec => '../../node_modules/react-native/third-party-podspecs/glog.podspec'
|
||||||
pod 'Folly', :podspec => '../node_modules/react-native/third-party-podspecs/Folly.podspec'
|
pod 'Folly', :podspec => '../../node_modules/react-native/third-party-podspecs/Folly.podspec'
|
||||||
|
|
||||||
use_native_modules!
|
use_native_modules!
|
||||||
use_unimodules!
|
use_unimodules!({ modules_paths: ['../../node_modules'] })
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -2,6 +2,8 @@ PODS:
|
|||||||
- boost-for-react-native (1.63.0)
|
- boost-for-react-native (1.63.0)
|
||||||
- DoubleConversion (1.1.6)
|
- DoubleConversion (1.1.6)
|
||||||
- EXAppLoaderProvider (8.0.0)
|
- EXAppLoaderProvider (8.0.0)
|
||||||
|
- EXBlur (8.0.0):
|
||||||
|
- UMCore
|
||||||
- EXConstants (8.0.0):
|
- EXConstants (8.0.0):
|
||||||
- UMConstantsInterface
|
- UMConstantsInterface
|
||||||
- UMCore
|
- UMCore
|
||||||
@@ -48,6 +50,8 @@ PODS:
|
|||||||
- glog
|
- glog
|
||||||
- glog (0.3.5)
|
- glog (0.3.5)
|
||||||
- RCTRequired (0.61.5)
|
- RCTRequired (0.61.5)
|
||||||
|
- RCTRestart (0.0.13):
|
||||||
|
- React
|
||||||
- RCTTypeSafety (0.61.5):
|
- RCTTypeSafety (0.61.5):
|
||||||
- FBLazyVector (= 0.61.5)
|
- FBLazyVector (= 0.61.5)
|
||||||
- Folly (= 2018.10.22.00)
|
- Folly (= 2018.10.22.00)
|
||||||
@@ -249,11 +253,11 @@ PODS:
|
|||||||
- ReactCommon/jscallinvoker (= 0.61.5)
|
- ReactCommon/jscallinvoker (= 0.61.5)
|
||||||
- RNCMaskedView (0.1.5):
|
- RNCMaskedView (0.1.5):
|
||||||
- React
|
- React
|
||||||
- RNGestureHandler (1.5.3):
|
- RNGestureHandler (1.5.5):
|
||||||
- React
|
- React
|
||||||
- RNReanimated (1.4.0):
|
- RNReanimated (1.4.0):
|
||||||
- React
|
- React
|
||||||
- RNScreens (2.0.0-alpha.22):
|
- RNScreens (2.0.0-alpha.33):
|
||||||
- React
|
- React
|
||||||
- UMBarCodeScannerInterface (5.0.0)
|
- UMBarCodeScannerInterface (5.0.0)
|
||||||
- UMCameraInterface (5.0.0)
|
- UMCameraInterface (5.0.0)
|
||||||
@@ -273,62 +277,64 @@ PODS:
|
|||||||
- Yoga (1.14.0)
|
- Yoga (1.14.0)
|
||||||
|
|
||||||
DEPENDENCIES:
|
DEPENDENCIES:
|
||||||
- DoubleConversion (from `../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec`)
|
- DoubleConversion (from `../../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec`)
|
||||||
- EXAppLoaderProvider (from `../node_modules/expo-app-loader-provider/ios`)
|
- EXAppLoaderProvider (from `../../node_modules/expo-app-loader-provider/ios`)
|
||||||
- EXConstants (from `../node_modules/expo-constants/ios`)
|
- EXBlur (from `../../node_modules/expo-blur/ios`)
|
||||||
- EXErrorRecovery (from `../node_modules/expo-error-recovery/ios`)
|
- EXConstants (from `../../node_modules/expo-constants/ios`)
|
||||||
- EXFileSystem (from `../node_modules/expo-file-system/ios`)
|
- EXErrorRecovery (from `../../node_modules/expo-error-recovery/ios`)
|
||||||
- EXFont (from `../node_modules/expo-font/ios`)
|
- EXFileSystem (from `../../node_modules/expo-file-system/ios`)
|
||||||
- EXKeepAwake (from `../node_modules/expo-keep-awake/ios`)
|
- EXFont (from `../../node_modules/expo-font/ios`)
|
||||||
- EXLinearGradient (from `../node_modules/expo-linear-gradient/ios`)
|
- EXKeepAwake (from `../../node_modules/expo-keep-awake/ios`)
|
||||||
- EXLocation (from `../node_modules/expo-location/ios`)
|
- EXLinearGradient (from `../../node_modules/expo-linear-gradient/ios`)
|
||||||
- EXPermissions (from `../node_modules/expo-permissions/ios`)
|
- EXLocation (from `../../node_modules/expo-location/ios`)
|
||||||
- EXSQLite (from `../node_modules/expo-sqlite/ios`)
|
- EXPermissions (from `../../node_modules/expo-permissions/ios`)
|
||||||
- EXWebBrowser (from `../node_modules/expo-web-browser/ios`)
|
- EXSQLite (from `../../node_modules/expo-sqlite/ios`)
|
||||||
- FBLazyVector (from `../node_modules/react-native/Libraries/FBLazyVector`)
|
- EXWebBrowser (from `../../node_modules/expo-web-browser/ios`)
|
||||||
- FBReactNativeSpec (from `../node_modules/react-native/Libraries/FBReactNativeSpec`)
|
- FBLazyVector (from `../../node_modules/react-native/Libraries/FBLazyVector`)
|
||||||
- Folly (from `../node_modules/react-native/third-party-podspecs/Folly.podspec`)
|
- FBReactNativeSpec (from `../../node_modules/react-native/Libraries/FBReactNativeSpec`)
|
||||||
- glog (from `../node_modules/react-native/third-party-podspecs/glog.podspec`)
|
- Folly (from `../../node_modules/react-native/third-party-podspecs/Folly.podspec`)
|
||||||
- RCTRequired (from `../node_modules/react-native/Libraries/RCTRequired`)
|
- glog (from `../../node_modules/react-native/third-party-podspecs/glog.podspec`)
|
||||||
- RCTTypeSafety (from `../node_modules/react-native/Libraries/TypeSafety`)
|
- RCTRequired (from `../../node_modules/react-native/Libraries/RCTRequired`)
|
||||||
- React (from `../node_modules/react-native/`)
|
- RCTRestart (from `../../node_modules/react-native-restart/ios`)
|
||||||
- React-Core (from `../node_modules/react-native/`)
|
- RCTTypeSafety (from `../../node_modules/react-native/Libraries/TypeSafety`)
|
||||||
- React-Core/DevSupport (from `../node_modules/react-native/`)
|
- React (from `../../node_modules/react-native/`)
|
||||||
- React-Core/RCTWebSocket (from `../node_modules/react-native/`)
|
- React-Core (from `../../node_modules/react-native/`)
|
||||||
- React-CoreModules (from `../node_modules/react-native/React/CoreModules`)
|
- React-Core/DevSupport (from `../../node_modules/react-native/`)
|
||||||
- React-cxxreact (from `../node_modules/react-native/ReactCommon/cxxreact`)
|
- React-Core/RCTWebSocket (from `../../node_modules/react-native/`)
|
||||||
- React-jsi (from `../node_modules/react-native/ReactCommon/jsi`)
|
- React-CoreModules (from `../../node_modules/react-native/React/CoreModules`)
|
||||||
- React-jsiexecutor (from `../node_modules/react-native/ReactCommon/jsiexecutor`)
|
- React-cxxreact (from `../../node_modules/react-native/ReactCommon/cxxreact`)
|
||||||
- React-jsinspector (from `../node_modules/react-native/ReactCommon/jsinspector`)
|
- React-jsi (from `../../node_modules/react-native/ReactCommon/jsi`)
|
||||||
- react-native-safe-area-context (from `../node_modules/react-native-safe-area-context`)
|
- React-jsiexecutor (from `../../node_modules/react-native/ReactCommon/jsiexecutor`)
|
||||||
- React-RCTActionSheet (from `../node_modules/react-native/Libraries/ActionSheetIOS`)
|
- React-jsinspector (from `../../node_modules/react-native/ReactCommon/jsinspector`)
|
||||||
- React-RCTAnimation (from `../node_modules/react-native/Libraries/NativeAnimation`)
|
- react-native-safe-area-context (from `../../node_modules/react-native-safe-area-context`)
|
||||||
- React-RCTBlob (from `../node_modules/react-native/Libraries/Blob`)
|
- React-RCTActionSheet (from `../../node_modules/react-native/Libraries/ActionSheetIOS`)
|
||||||
- React-RCTImage (from `../node_modules/react-native/Libraries/Image`)
|
- React-RCTAnimation (from `../../node_modules/react-native/Libraries/NativeAnimation`)
|
||||||
- React-RCTLinking (from `../node_modules/react-native/Libraries/LinkingIOS`)
|
- React-RCTBlob (from `../../node_modules/react-native/Libraries/Blob`)
|
||||||
- React-RCTNetwork (from `../node_modules/react-native/Libraries/Network`)
|
- React-RCTImage (from `../../node_modules/react-native/Libraries/Image`)
|
||||||
- React-RCTSettings (from `../node_modules/react-native/Libraries/Settings`)
|
- React-RCTLinking (from `../../node_modules/react-native/Libraries/LinkingIOS`)
|
||||||
- React-RCTText (from `../node_modules/react-native/Libraries/Text`)
|
- React-RCTNetwork (from `../../node_modules/react-native/Libraries/Network`)
|
||||||
- React-RCTVibration (from `../node_modules/react-native/Libraries/Vibration`)
|
- React-RCTSettings (from `../../node_modules/react-native/Libraries/Settings`)
|
||||||
- ReactCommon/jscallinvoker (from `../node_modules/react-native/ReactCommon`)
|
- React-RCTText (from `../../node_modules/react-native/Libraries/Text`)
|
||||||
- ReactCommon/turbomodule/core (from `../node_modules/react-native/ReactCommon`)
|
- React-RCTVibration (from `../../node_modules/react-native/Libraries/Vibration`)
|
||||||
- "RNCMaskedView (from `../node_modules/@react-native-community/masked-view`)"
|
- ReactCommon/jscallinvoker (from `../../node_modules/react-native/ReactCommon`)
|
||||||
- RNGestureHandler (from `../node_modules/react-native-gesture-handler`)
|
- ReactCommon/turbomodule/core (from `../../node_modules/react-native/ReactCommon`)
|
||||||
- RNReanimated (from `../node_modules/react-native-reanimated`)
|
- "RNCMaskedView (from `../../node_modules/@react-native-community/masked-view`)"
|
||||||
- RNScreens (from `../node_modules/react-native-screens`)
|
- RNGestureHandler (from `../../node_modules/react-native-gesture-handler`)
|
||||||
- UMBarCodeScannerInterface (from `../node_modules/unimodules-barcode-scanner-interface/ios`)
|
- RNReanimated (from `../../node_modules/react-native-reanimated`)
|
||||||
- UMCameraInterface (from `../node_modules/unimodules-camera-interface/ios`)
|
- RNScreens (from `../../node_modules/react-native-screens`)
|
||||||
- UMConstantsInterface (from `../node_modules/unimodules-constants-interface/ios`)
|
- UMBarCodeScannerInterface (from `../../node_modules/unimodules-barcode-scanner-interface/ios`)
|
||||||
- "UMCore (from `../node_modules/@unimodules/core/ios`)"
|
- UMCameraInterface (from `../../node_modules/unimodules-camera-interface/ios`)
|
||||||
- UMFaceDetectorInterface (from `../node_modules/unimodules-face-detector-interface/ios`)
|
- UMConstantsInterface (from `../../node_modules/unimodules-constants-interface/ios`)
|
||||||
- UMFileSystemInterface (from `../node_modules/unimodules-file-system-interface/ios`)
|
- "UMCore (from `../../node_modules/@unimodules/core/ios`)"
|
||||||
- UMFontInterface (from `../node_modules/unimodules-font-interface/ios`)
|
- UMFaceDetectorInterface (from `../../node_modules/unimodules-face-detector-interface/ios`)
|
||||||
- UMImageLoaderInterface (from `../node_modules/unimodules-image-loader-interface/ios`)
|
- UMFileSystemInterface (from `../../node_modules/unimodules-file-system-interface/ios`)
|
||||||
- UMPermissionsInterface (from `../node_modules/unimodules-permissions-interface/ios`)
|
- UMFontInterface (from `../../node_modules/unimodules-font-interface/ios`)
|
||||||
- "UMReactNativeAdapter (from `../node_modules/@unimodules/react-native-adapter/ios`)"
|
- UMImageLoaderInterface (from `../../node_modules/unimodules-image-loader-interface/ios`)
|
||||||
- UMSensorsInterface (from `../node_modules/unimodules-sensors-interface/ios`)
|
- UMPermissionsInterface (from `../../node_modules/unimodules-permissions-interface/ios`)
|
||||||
- UMTaskManagerInterface (from `../node_modules/unimodules-task-manager-interface/ios`)
|
- "UMReactNativeAdapter (from `../../node_modules/@unimodules/react-native-adapter/ios`)"
|
||||||
- Yoga (from `../node_modules/react-native/ReactCommon/yoga`)
|
- UMSensorsInterface (from `../../node_modules/unimodules-sensors-interface/ios`)
|
||||||
|
- UMTaskManagerInterface (from `../../node_modules/unimodules-task-manager-interface/ios`)
|
||||||
|
- Yoga (from `../../node_modules/react-native/ReactCommon/yoga`)
|
||||||
|
|
||||||
SPEC REPOS:
|
SPEC REPOS:
|
||||||
trunk:
|
trunk:
|
||||||
@@ -336,139 +342,145 @@ SPEC REPOS:
|
|||||||
|
|
||||||
EXTERNAL SOURCES:
|
EXTERNAL SOURCES:
|
||||||
DoubleConversion:
|
DoubleConversion:
|
||||||
:podspec: "../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec"
|
:podspec: "../../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec"
|
||||||
EXAppLoaderProvider:
|
EXAppLoaderProvider:
|
||||||
:path: !ruby/object:Pathname
|
:path: !ruby/object:Pathname
|
||||||
path: "../node_modules/expo-app-loader-provider/ios"
|
path: "../../node_modules/expo-app-loader-provider/ios"
|
||||||
|
EXBlur:
|
||||||
|
:path: !ruby/object:Pathname
|
||||||
|
path: "../../node_modules/expo-blur/ios"
|
||||||
EXConstants:
|
EXConstants:
|
||||||
:path: !ruby/object:Pathname
|
:path: !ruby/object:Pathname
|
||||||
path: "../node_modules/expo-constants/ios"
|
path: "../../node_modules/expo-constants/ios"
|
||||||
EXErrorRecovery:
|
EXErrorRecovery:
|
||||||
:path: !ruby/object:Pathname
|
:path: !ruby/object:Pathname
|
||||||
path: "../node_modules/expo-error-recovery/ios"
|
path: "../../node_modules/expo-error-recovery/ios"
|
||||||
EXFileSystem:
|
EXFileSystem:
|
||||||
:path: !ruby/object:Pathname
|
:path: !ruby/object:Pathname
|
||||||
path: "../node_modules/expo-file-system/ios"
|
path: "../../node_modules/expo-file-system/ios"
|
||||||
EXFont:
|
EXFont:
|
||||||
:path: !ruby/object:Pathname
|
:path: !ruby/object:Pathname
|
||||||
path: "../node_modules/expo-font/ios"
|
path: "../../node_modules/expo-font/ios"
|
||||||
EXKeepAwake:
|
EXKeepAwake:
|
||||||
:path: !ruby/object:Pathname
|
:path: !ruby/object:Pathname
|
||||||
path: "../node_modules/expo-keep-awake/ios"
|
path: "../../node_modules/expo-keep-awake/ios"
|
||||||
EXLinearGradient:
|
EXLinearGradient:
|
||||||
:path: !ruby/object:Pathname
|
:path: !ruby/object:Pathname
|
||||||
path: "../node_modules/expo-linear-gradient/ios"
|
path: "../../node_modules/expo-linear-gradient/ios"
|
||||||
EXLocation:
|
EXLocation:
|
||||||
:path: !ruby/object:Pathname
|
:path: !ruby/object:Pathname
|
||||||
path: "../node_modules/expo-location/ios"
|
path: "../../node_modules/expo-location/ios"
|
||||||
EXPermissions:
|
EXPermissions:
|
||||||
:path: !ruby/object:Pathname
|
:path: !ruby/object:Pathname
|
||||||
path: "../node_modules/expo-permissions/ios"
|
path: "../../node_modules/expo-permissions/ios"
|
||||||
EXSQLite:
|
EXSQLite:
|
||||||
:path: !ruby/object:Pathname
|
:path: !ruby/object:Pathname
|
||||||
path: "../node_modules/expo-sqlite/ios"
|
path: "../../node_modules/expo-sqlite/ios"
|
||||||
EXWebBrowser:
|
EXWebBrowser:
|
||||||
:path: !ruby/object:Pathname
|
:path: !ruby/object:Pathname
|
||||||
path: "../node_modules/expo-web-browser/ios"
|
path: "../../node_modules/expo-web-browser/ios"
|
||||||
FBLazyVector:
|
FBLazyVector:
|
||||||
:path: "../node_modules/react-native/Libraries/FBLazyVector"
|
:path: "../../node_modules/react-native/Libraries/FBLazyVector"
|
||||||
FBReactNativeSpec:
|
FBReactNativeSpec:
|
||||||
:path: "../node_modules/react-native/Libraries/FBReactNativeSpec"
|
:path: "../../node_modules/react-native/Libraries/FBReactNativeSpec"
|
||||||
Folly:
|
Folly:
|
||||||
:podspec: "../node_modules/react-native/third-party-podspecs/Folly.podspec"
|
:podspec: "../../node_modules/react-native/third-party-podspecs/Folly.podspec"
|
||||||
glog:
|
glog:
|
||||||
:podspec: "../node_modules/react-native/third-party-podspecs/glog.podspec"
|
:podspec: "../../node_modules/react-native/third-party-podspecs/glog.podspec"
|
||||||
RCTRequired:
|
RCTRequired:
|
||||||
:path: "../node_modules/react-native/Libraries/RCTRequired"
|
:path: "../../node_modules/react-native/Libraries/RCTRequired"
|
||||||
|
RCTRestart:
|
||||||
|
:path: "../../node_modules/react-native-restart/ios"
|
||||||
RCTTypeSafety:
|
RCTTypeSafety:
|
||||||
:path: "../node_modules/react-native/Libraries/TypeSafety"
|
:path: "../../node_modules/react-native/Libraries/TypeSafety"
|
||||||
React:
|
React:
|
||||||
:path: "../node_modules/react-native/"
|
:path: "../../node_modules/react-native/"
|
||||||
React-Core:
|
React-Core:
|
||||||
:path: "../node_modules/react-native/"
|
:path: "../../node_modules/react-native/"
|
||||||
React-CoreModules:
|
React-CoreModules:
|
||||||
:path: "../node_modules/react-native/React/CoreModules"
|
:path: "../../node_modules/react-native/React/CoreModules"
|
||||||
React-cxxreact:
|
React-cxxreact:
|
||||||
:path: "../node_modules/react-native/ReactCommon/cxxreact"
|
:path: "../../node_modules/react-native/ReactCommon/cxxreact"
|
||||||
React-jsi:
|
React-jsi:
|
||||||
:path: "../node_modules/react-native/ReactCommon/jsi"
|
:path: "../../node_modules/react-native/ReactCommon/jsi"
|
||||||
React-jsiexecutor:
|
React-jsiexecutor:
|
||||||
:path: "../node_modules/react-native/ReactCommon/jsiexecutor"
|
:path: "../../node_modules/react-native/ReactCommon/jsiexecutor"
|
||||||
React-jsinspector:
|
React-jsinspector:
|
||||||
:path: "../node_modules/react-native/ReactCommon/jsinspector"
|
:path: "../../node_modules/react-native/ReactCommon/jsinspector"
|
||||||
react-native-safe-area-context:
|
react-native-safe-area-context:
|
||||||
:path: "../node_modules/react-native-safe-area-context"
|
:path: "../../node_modules/react-native-safe-area-context"
|
||||||
React-RCTActionSheet:
|
React-RCTActionSheet:
|
||||||
:path: "../node_modules/react-native/Libraries/ActionSheetIOS"
|
:path: "../../node_modules/react-native/Libraries/ActionSheetIOS"
|
||||||
React-RCTAnimation:
|
React-RCTAnimation:
|
||||||
:path: "../node_modules/react-native/Libraries/NativeAnimation"
|
:path: "../../node_modules/react-native/Libraries/NativeAnimation"
|
||||||
React-RCTBlob:
|
React-RCTBlob:
|
||||||
:path: "../node_modules/react-native/Libraries/Blob"
|
:path: "../../node_modules/react-native/Libraries/Blob"
|
||||||
React-RCTImage:
|
React-RCTImage:
|
||||||
:path: "../node_modules/react-native/Libraries/Image"
|
:path: "../../node_modules/react-native/Libraries/Image"
|
||||||
React-RCTLinking:
|
React-RCTLinking:
|
||||||
:path: "../node_modules/react-native/Libraries/LinkingIOS"
|
:path: "../../node_modules/react-native/Libraries/LinkingIOS"
|
||||||
React-RCTNetwork:
|
React-RCTNetwork:
|
||||||
:path: "../node_modules/react-native/Libraries/Network"
|
:path: "../../node_modules/react-native/Libraries/Network"
|
||||||
React-RCTSettings:
|
React-RCTSettings:
|
||||||
:path: "../node_modules/react-native/Libraries/Settings"
|
:path: "../../node_modules/react-native/Libraries/Settings"
|
||||||
React-RCTText:
|
React-RCTText:
|
||||||
:path: "../node_modules/react-native/Libraries/Text"
|
:path: "../../node_modules/react-native/Libraries/Text"
|
||||||
React-RCTVibration:
|
React-RCTVibration:
|
||||||
:path: "../node_modules/react-native/Libraries/Vibration"
|
:path: "../../node_modules/react-native/Libraries/Vibration"
|
||||||
ReactCommon:
|
ReactCommon:
|
||||||
:path: "../node_modules/react-native/ReactCommon"
|
:path: "../../node_modules/react-native/ReactCommon"
|
||||||
RNCMaskedView:
|
RNCMaskedView:
|
||||||
:path: "../node_modules/@react-native-community/masked-view"
|
:path: "../../node_modules/@react-native-community/masked-view"
|
||||||
RNGestureHandler:
|
RNGestureHandler:
|
||||||
:path: "../node_modules/react-native-gesture-handler"
|
:path: "../../node_modules/react-native-gesture-handler"
|
||||||
RNReanimated:
|
RNReanimated:
|
||||||
:path: "../node_modules/react-native-reanimated"
|
:path: "../../node_modules/react-native-reanimated"
|
||||||
RNScreens:
|
RNScreens:
|
||||||
:path: "../node_modules/react-native-screens"
|
:path: "../../node_modules/react-native-screens"
|
||||||
UMBarCodeScannerInterface:
|
UMBarCodeScannerInterface:
|
||||||
:path: !ruby/object:Pathname
|
:path: !ruby/object:Pathname
|
||||||
path: "../node_modules/unimodules-barcode-scanner-interface/ios"
|
path: "../../node_modules/unimodules-barcode-scanner-interface/ios"
|
||||||
UMCameraInterface:
|
UMCameraInterface:
|
||||||
:path: !ruby/object:Pathname
|
:path: !ruby/object:Pathname
|
||||||
path: "../node_modules/unimodules-camera-interface/ios"
|
path: "../../node_modules/unimodules-camera-interface/ios"
|
||||||
UMConstantsInterface:
|
UMConstantsInterface:
|
||||||
:path: !ruby/object:Pathname
|
:path: !ruby/object:Pathname
|
||||||
path: "../node_modules/unimodules-constants-interface/ios"
|
path: "../../node_modules/unimodules-constants-interface/ios"
|
||||||
UMCore:
|
UMCore:
|
||||||
:path: !ruby/object:Pathname
|
:path: !ruby/object:Pathname
|
||||||
path: "../node_modules/@unimodules/core/ios"
|
path: "../../node_modules/@unimodules/core/ios"
|
||||||
UMFaceDetectorInterface:
|
UMFaceDetectorInterface:
|
||||||
:path: !ruby/object:Pathname
|
:path: !ruby/object:Pathname
|
||||||
path: "../node_modules/unimodules-face-detector-interface/ios"
|
path: "../../node_modules/unimodules-face-detector-interface/ios"
|
||||||
UMFileSystemInterface:
|
UMFileSystemInterface:
|
||||||
:path: !ruby/object:Pathname
|
:path: !ruby/object:Pathname
|
||||||
path: "../node_modules/unimodules-file-system-interface/ios"
|
path: "../../node_modules/unimodules-file-system-interface/ios"
|
||||||
UMFontInterface:
|
UMFontInterface:
|
||||||
:path: !ruby/object:Pathname
|
:path: !ruby/object:Pathname
|
||||||
path: "../node_modules/unimodules-font-interface/ios"
|
path: "../../node_modules/unimodules-font-interface/ios"
|
||||||
UMImageLoaderInterface:
|
UMImageLoaderInterface:
|
||||||
:path: !ruby/object:Pathname
|
:path: !ruby/object:Pathname
|
||||||
path: "../node_modules/unimodules-image-loader-interface/ios"
|
path: "../../node_modules/unimodules-image-loader-interface/ios"
|
||||||
UMPermissionsInterface:
|
UMPermissionsInterface:
|
||||||
:path: !ruby/object:Pathname
|
:path: !ruby/object:Pathname
|
||||||
path: "../node_modules/unimodules-permissions-interface/ios"
|
path: "../../node_modules/unimodules-permissions-interface/ios"
|
||||||
UMReactNativeAdapter:
|
UMReactNativeAdapter:
|
||||||
:path: !ruby/object:Pathname
|
:path: !ruby/object:Pathname
|
||||||
path: "../node_modules/@unimodules/react-native-adapter/ios"
|
path: "../../node_modules/@unimodules/react-native-adapter/ios"
|
||||||
UMSensorsInterface:
|
UMSensorsInterface:
|
||||||
:path: !ruby/object:Pathname
|
:path: !ruby/object:Pathname
|
||||||
path: "../node_modules/unimodules-sensors-interface/ios"
|
path: "../../node_modules/unimodules-sensors-interface/ios"
|
||||||
UMTaskManagerInterface:
|
UMTaskManagerInterface:
|
||||||
:path: !ruby/object:Pathname
|
:path: !ruby/object:Pathname
|
||||||
path: "../node_modules/unimodules-task-manager-interface/ios"
|
path: "../../node_modules/unimodules-task-manager-interface/ios"
|
||||||
Yoga:
|
Yoga:
|
||||||
:path: "../node_modules/react-native/ReactCommon/yoga"
|
:path: "../../node_modules/react-native/ReactCommon/yoga"
|
||||||
|
|
||||||
SPEC CHECKSUMS:
|
SPEC CHECKSUMS:
|
||||||
boost-for-react-native: 39c7adb57c4e60d6c5479dd8623128eb5b3f0f2c
|
boost-for-react-native: 39c7adb57c4e60d6c5479dd8623128eb5b3f0f2c
|
||||||
DoubleConversion: 5805e889d232975c086db112ece9ed034df7a0b2
|
DoubleConversion: 5805e889d232975c086db112ece9ed034df7a0b2
|
||||||
EXAppLoaderProvider: ebdb6bc2632c1ccadbe49f5e4104d8d690969c49
|
EXAppLoaderProvider: ebdb6bc2632c1ccadbe49f5e4104d8d690969c49
|
||||||
|
EXBlur: d1604f66f89a9414f5ee65dfb23874437c1bb147
|
||||||
EXConstants: 4051b16c17ef3defa03c541d42811dc92b249146
|
EXConstants: 4051b16c17ef3defa03c541d42811dc92b249146
|
||||||
EXErrorRecovery: d36db99ec6a3808f313f01b0890eb443796dd1c2
|
EXErrorRecovery: d36db99ec6a3808f313f01b0890eb443796dd1c2
|
||||||
EXFileSystem: 6e0d9bb6cc4ea404dbb8f583c1a8a2dcdf4b83b6
|
EXFileSystem: 6e0d9bb6cc4ea404dbb8f583c1a8a2dcdf4b83b6
|
||||||
@@ -484,6 +496,7 @@ SPEC CHECKSUMS:
|
|||||||
Folly: 30e7936e1c45c08d884aa59369ed951a8e68cf51
|
Folly: 30e7936e1c45c08d884aa59369ed951a8e68cf51
|
||||||
glog: 1f3da668190260b06b429bb211bfbee5cd790c28
|
glog: 1f3da668190260b06b429bb211bfbee5cd790c28
|
||||||
RCTRequired: b153add4da6e7dbc44aebf93f3cf4fcae392ddf1
|
RCTRequired: b153add4da6e7dbc44aebf93f3cf4fcae392ddf1
|
||||||
|
RCTRestart: dd19aab87fc1118e05b6b5b91b959105647f56b4
|
||||||
RCTTypeSafety: 9aa1b91d7f9310fc6eadc3cf95126ffe818af320
|
RCTTypeSafety: 9aa1b91d7f9310fc6eadc3cf95126ffe818af320
|
||||||
React: b6a59ef847b2b40bb6e0180a97d0ca716969ac78
|
React: b6a59ef847b2b40bb6e0180a97d0ca716969ac78
|
||||||
React-Core: 688b451f7d616cc1134ac95295b593d1b5158a04
|
React-Core: 688b451f7d616cc1134ac95295b593d1b5158a04
|
||||||
@@ -504,9 +517,9 @@ SPEC CHECKSUMS:
|
|||||||
React-RCTVibration: a49a1f42bf8f5acf1c3e297097517c6b3af377ad
|
React-RCTVibration: a49a1f42bf8f5acf1c3e297097517c6b3af377ad
|
||||||
ReactCommon: 198c7c8d3591f975e5431bec1b0b3b581aa1c5dd
|
ReactCommon: 198c7c8d3591f975e5431bec1b0b3b581aa1c5dd
|
||||||
RNCMaskedView: dd13f9f7b146a9ad82f9b7eb6c9b5548fcf6e990
|
RNCMaskedView: dd13f9f7b146a9ad82f9b7eb6c9b5548fcf6e990
|
||||||
RNGestureHandler: 02905abe54e1f6e59c081a10b4bd689721e17aa6
|
RNGestureHandler: d2270608171c868581b840cfc692f2962c05cd17
|
||||||
RNReanimated: b2ab0b693dddd2339bd2f300e770f6302d2e960c
|
RNReanimated: b2ab0b693dddd2339bd2f300e770f6302d2e960c
|
||||||
RNScreens: 6adf01eb4080f44af6cca551207c6b0505066857
|
RNScreens: 1c7fd499b915c77c21e8e6c327890c5af9b4cf7e
|
||||||
UMBarCodeScannerInterface: 3802c8574ef119c150701d679ab386e2266d6a54
|
UMBarCodeScannerInterface: 3802c8574ef119c150701d679ab386e2266d6a54
|
||||||
UMCameraInterface: 985d301f688ed392f815728f0dd906ca34b7ccb1
|
UMCameraInterface: 985d301f688ed392f815728f0dd906ca34b7ccb1
|
||||||
UMConstantsInterface: bda5f8bd3403ad99e663eb3c4da685d063c5653c
|
UMConstantsInterface: bda5f8bd3403ad99e663eb3c4da685d063c5653c
|
||||||
@@ -521,6 +534,6 @@ SPEC CHECKSUMS:
|
|||||||
UMTaskManagerInterface: a98e37a576a5220bf43b8faf33cfdc129d2f441d
|
UMTaskManagerInterface: a98e37a576a5220bf43b8faf33cfdc129d2f441d
|
||||||
Yoga: f2a7cd4280bfe2cca5a7aed98ba0eb3d1310f18b
|
Yoga: f2a7cd4280bfe2cca5a7aed98ba0eb3d1310f18b
|
||||||
|
|
||||||
PODFILE CHECKSUM: 18b58708b4bb9901516029103ee63c94d63edd9e
|
PODFILE CHECKSUM: c48a21ff513d3eadafa50f8797207ef2be75e234
|
||||||
|
|
||||||
COCOAPODS: 1.8.4
|
COCOAPODS: 1.8.4
|
||||||
|
|||||||
@@ -188,7 +188,7 @@
|
|||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
shellPath = /bin/sh;
|
shellPath = /bin/sh;
|
||||||
shellScript = "export NODE_BINARY=node\n../node_modules/react-native/scripts/react-native-xcode.sh";
|
shellScript = "export NODE_BINARY=node\n../../node_modules/react-native/scripts/react-native-xcode.sh";
|
||||||
};
|
};
|
||||||
FC67D3D0567CD942E3DA69B7 /* [CP] Check Pods Manifest.lock */ = {
|
FC67D3D0567CD942E3DA69B7 /* [CP] Check Pods Manifest.lock */ = {
|
||||||
isa = PBXShellScriptBuildPhase;
|
isa = PBXShellScriptBuildPhase;
|
||||||
|
|||||||
@@ -13,6 +13,7 @@
|
|||||||
#import <UMCore/UMModuleRegistry.h>
|
#import <UMCore/UMModuleRegistry.h>
|
||||||
#import <UMReactNativeAdapter/UMNativeModulesProxy.h>
|
#import <UMReactNativeAdapter/UMNativeModulesProxy.h>
|
||||||
#import <UMReactNativeAdapter/UMModuleRegistryAdapter.h>
|
#import <UMReactNativeAdapter/UMModuleRegistryAdapter.h>
|
||||||
|
#import <React/RCTLinkingManager.h>
|
||||||
|
|
||||||
@implementation AppDelegate
|
@implementation AppDelegate
|
||||||
|
|
||||||
@@ -52,4 +53,10 @@
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url
|
||||||
|
options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options
|
||||||
|
{
|
||||||
|
return [RCTLinkingManager application:app openURL:url options:options];
|
||||||
|
}
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|||||||
@@ -20,33 +20,27 @@
|
|||||||
<string>1.0</string>
|
<string>1.0</string>
|
||||||
<key>CFBundleSignature</key>
|
<key>CFBundleSignature</key>
|
||||||
<string>????</string>
|
<string>????</string>
|
||||||
|
<key>CFBundleURLTypes</key>
|
||||||
|
<array>
|
||||||
|
<dict>
|
||||||
|
<key>CFBundleTypeRole</key>
|
||||||
|
<string>Editor</string>
|
||||||
|
<key>CFBundleURLName</key>
|
||||||
|
<string>React Navigation Example</string>
|
||||||
|
<key>CFBundleURLSchemes</key>
|
||||||
|
<array>
|
||||||
|
<string>rne</string>
|
||||||
|
</array>
|
||||||
|
</dict>
|
||||||
|
</array>
|
||||||
<key>CFBundleVersion</key>
|
<key>CFBundleVersion</key>
|
||||||
<string>1</string>
|
<string>1</string>
|
||||||
<key>LSRequiresIPhoneOS</key>
|
<key>LSRequiresIPhoneOS</key>
|
||||||
<true/>
|
<true/>
|
||||||
<key>NSLocationWhenInUseUsageDescription</key>
|
|
||||||
<string></string>
|
|
||||||
<key>UILaunchStoryboardName</key>
|
|
||||||
<string>LaunchScreen</string>
|
|
||||||
<key>UIRequiredDeviceCapabilities</key>
|
|
||||||
<array>
|
|
||||||
<string>armv7</string>
|
|
||||||
</array>
|
|
||||||
<key>UISupportedInterfaceOrientations</key>
|
|
||||||
<array>
|
|
||||||
<string>UIInterfaceOrientationPortrait</string>
|
|
||||||
<string>UIInterfaceOrientationLandscapeLeft</string>
|
|
||||||
<string>UIInterfaceOrientationLandscapeRight</string>
|
|
||||||
</array>
|
|
||||||
<key>UIViewControllerBasedStatusBarAppearance</key>
|
|
||||||
<false/>
|
|
||||||
<key>NSLocationWhenInUseUsageDescription</key>
|
|
||||||
<string></string>
|
|
||||||
<key>NSAppTransportSecurity</key>
|
<key>NSAppTransportSecurity</key>
|
||||||
<!--See http://ste.vn/2015/06/10/configuring-app-transport-security-ios-9-osx-10-11/ -->
|
|
||||||
<dict>
|
<dict>
|
||||||
<key>NSAllowsArbitraryLoads</key>
|
<key>NSAllowsArbitraryLoads</key>
|
||||||
<true/>
|
<true/>
|
||||||
<key>NSExceptionDomains</key>
|
<key>NSExceptionDomains</key>
|
||||||
<dict>
|
<dict>
|
||||||
<key>localhost</key>
|
<key>localhost</key>
|
||||||
@@ -78,5 +72,19 @@
|
|||||||
<string>Give React Navigation Example periences permission to access your photos</string>
|
<string>Give React Navigation Example periences permission to access your photos</string>
|
||||||
<key>NSRemindersUsageDescription</key>
|
<key>NSRemindersUsageDescription</key>
|
||||||
<string>Allow React Navigation Example to access your reminders</string>
|
<string>Allow React Navigation Example to access your reminders</string>
|
||||||
|
<key>UILaunchStoryboardName</key>
|
||||||
|
<string>LaunchScreen</string>
|
||||||
|
<key>UIRequiredDeviceCapabilities</key>
|
||||||
|
<array>
|
||||||
|
<string>armv7</string>
|
||||||
|
</array>
|
||||||
|
<key>UISupportedInterfaceOrientations</key>
|
||||||
|
<array>
|
||||||
|
<string>UIInterfaceOrientationPortrait</string>
|
||||||
|
<string>UIInterfaceOrientationLandscapeLeft</string>
|
||||||
|
<string>UIInterfaceOrientationLandscapeRight</string>
|
||||||
|
</array>
|
||||||
|
<key>UIViewControllerBasedStatusBarAppearance</key>
|
||||||
|
<false/>
|
||||||
</dict>
|
</dict>
|
||||||
</plist>
|
</plist>
|
||||||
|
|||||||
@@ -6,50 +6,60 @@ const escape = require('escape-string-regexp');
|
|||||||
const blacklist = require('metro-config/src/defaults/blacklist');
|
const blacklist = require('metro-config/src/defaults/blacklist');
|
||||||
|
|
||||||
const root = path.resolve(__dirname, '..');
|
const root = path.resolve(__dirname, '..');
|
||||||
const packages = path.resolve(__dirname, '..', 'packages');
|
const packages = path.resolve(root, 'packages');
|
||||||
|
|
||||||
const modules = ['@babel/runtime', '@expo/vector-icons']
|
// Get the list of dependencies for all packages in the monorepo
|
||||||
|
const modules = ['@expo/vector-icons']
|
||||||
.concat(
|
.concat(
|
||||||
...fs
|
...fs
|
||||||
|
// List all packages under `packages/`
|
||||||
.readdirSync(packages)
|
.readdirSync(packages)
|
||||||
|
// Ignore hidden files such as .DS_Store
|
||||||
.filter(p => !p.startsWith('.'))
|
.filter(p => !p.startsWith('.'))
|
||||||
.map(p => {
|
.map(p => {
|
||||||
const pak = JSON.parse(
|
const pak = JSON.parse(
|
||||||
fs.readFileSync(path.join(packages, p, 'package.json'), 'utf8')
|
fs.readFileSync(path.join(packages, p, 'package.json'), 'utf8')
|
||||||
);
|
);
|
||||||
|
|
||||||
const deps = [];
|
// We need to collect list of deps that this package imports
|
||||||
|
// Collecting both dependencies are peerDependencies should do it
|
||||||
if (pak.dependencies) {
|
return Object.keys({
|
||||||
deps.push(...Object.keys(pak.dependencies));
|
...pak.dependencies,
|
||||||
}
|
...pak.peerDependencies,
|
||||||
|
});
|
||||||
if (pak.peerDependencies) {
|
|
||||||
deps.push(...Object.keys(pak.peerDependencies));
|
|
||||||
}
|
|
||||||
|
|
||||||
return deps;
|
|
||||||
})
|
})
|
||||||
)
|
)
|
||||||
.sort()
|
.sort()
|
||||||
.filter(
|
.filter(
|
||||||
(m, i, self) =>
|
(m, i, self) =>
|
||||||
|
// Remove duplicates and package names of the packages in the monorepo
|
||||||
self.lastIndexOf(m) === i && !m.startsWith('@react-navigation/')
|
self.lastIndexOf(m) === i && !m.startsWith('@react-navigation/')
|
||||||
);
|
);
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
projectRoot: __dirname,
|
projectRoot: __dirname,
|
||||||
|
|
||||||
|
// We need to watch the root of the monorepo
|
||||||
|
// This lets Metro find the monorepo packages automatically using haste
|
||||||
|
// This also lets us import modules from monorepo root
|
||||||
watchFolders: [root],
|
watchFolders: [root],
|
||||||
|
|
||||||
resolver: {
|
resolver: {
|
||||||
|
// We need to blacklist `node_modules` of all our packages
|
||||||
|
// This will avoid Metro throwing duplicate module errors
|
||||||
blacklistRE: blacklist(
|
blacklistRE: blacklist(
|
||||||
[root, ...fs.readdirSync(packages).map(p => path.join(packages, p))].map(
|
fs
|
||||||
it => new RegExp(`^${escape(path.join(it, 'node_modules'))}\\/.*$`)
|
.readdirSync(packages)
|
||||||
)
|
.map(p => path.join(packages, p))
|
||||||
|
.map(
|
||||||
|
it => new RegExp(`^${escape(path.join(it, 'node_modules'))}\\/.*$`)
|
||||||
|
)
|
||||||
),
|
),
|
||||||
|
|
||||||
|
// When we import a package from the monorepo, metro won't be able to find their deps
|
||||||
|
// We need to specify them in `extraNodeModules` to tell metro where to find them
|
||||||
extraNodeModules: modules.reduce((acc, name) => {
|
extraNodeModules: modules.reduce((acc, name) => {
|
||||||
acc[name] = path.join(__dirname, 'node_modules', name);
|
acc[name] = path.join(root, 'node_modules', name);
|
||||||
return acc;
|
return acc;
|
||||||
}, {}),
|
}, {}),
|
||||||
},
|
},
|
||||||
@@ -57,6 +67,8 @@ module.exports = {
|
|||||||
server: {
|
server: {
|
||||||
enhanceMiddleware: middleware => {
|
enhanceMiddleware: middleware => {
|
||||||
return (req, res, next) => {
|
return (req, res, next) => {
|
||||||
|
// When an asset is imported outside the project root, it has wrong path on Android
|
||||||
|
// This happens for the back button in stack, so we fix the path to correct one
|
||||||
const assets = '/packages/stack/src/views/assets';
|
const assets = '/packages/stack/src/views/assets';
|
||||||
|
|
||||||
if (req.url.startsWith(assets)) {
|
if (req.url.startsWith(assets)) {
|
||||||
@@ -72,7 +84,7 @@ module.exports = {
|
|||||||
},
|
},
|
||||||
|
|
||||||
transformer: {
|
transformer: {
|
||||||
getTransformOptions: async () => ({
|
getTransformOptions: () => ({
|
||||||
transform: {
|
transform: {
|
||||||
experimentalImportSupport: false,
|
experimentalImportSupport: false,
|
||||||
inlineRequires: true,
|
inlineRequires: true,
|
||||||
|
|||||||
@@ -3,42 +3,33 @@
|
|||||||
"description": "Demo app to showcase various functionality of React Navigation",
|
"description": "Demo app to showcase various functionality of React Navigation",
|
||||||
"version": "5.0.0-alpha.23",
|
"version": "5.0.0-alpha.23",
|
||||||
"private": true,
|
"private": true,
|
||||||
"workspaces": {
|
|
||||||
"nohoist": [
|
|
||||||
"*",
|
|
||||||
"*/**"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"start": "expo start",
|
"start": "expo start",
|
||||||
"web": "expo start --web",
|
"web": "expo start:web",
|
||||||
"react-native": "./node_modules/.bin/react-native",
|
"native": "react-native start",
|
||||||
"native": "./node_modules/.bin/react-native start",
|
"android": "react-native run-android",
|
||||||
"android": "./node_modules/.bin/react-native run-android",
|
"ios": "react-native run-ios"
|
||||||
"ios": "./node_modules/.bin/react-native run-ios"
|
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@expo/vector-icons": "^10.0.0",
|
"@expo/vector-icons": "^10.0.0",
|
||||||
"@react-native-community/masked-view": "0.1.5",
|
"@react-native-community/masked-view": "0.1.5",
|
||||||
|
"@types/react-native-restart": "^0.0.0",
|
||||||
"color": "^3.1.2",
|
"color": "^3.1.2",
|
||||||
"expo": "^36.0.2",
|
"expo": "^36.0.2",
|
||||||
"expo-asset": "~8.0.0",
|
"expo-asset": "~8.0.0",
|
||||||
"query-string": "^6.9.0",
|
"expo-blur": "^8.0.0",
|
||||||
"react": "~16.9.0",
|
"react": "~16.9.0",
|
||||||
"react-dom": "~16.9.0",
|
"react-dom": "~16.9.0",
|
||||||
"react-native": "~0.61.5",
|
"react-native": "~0.61.5",
|
||||||
"react-native-gesture-handler": "~1.5.3",
|
"react-native-gesture-handler": "^1.5.5",
|
||||||
"react-native-iphone-x-helper": "^1.2.1",
|
"react-native-paper": "^3.5.0",
|
||||||
"react-native-paper": "^3.4.0",
|
|
||||||
"react-native-reanimated": "^1.4.0",
|
"react-native-reanimated": "^1.4.0",
|
||||||
|
"react-native-restart": "^0.0.13",
|
||||||
"react-native-safe-area-context": "^0.6.2",
|
"react-native-safe-area-context": "^0.6.2",
|
||||||
"react-native-screens": "^2.0.0-alpha.22",
|
"react-native-screens": "^2.0.0-alpha.33",
|
||||||
"react-native-tab-view": "2.11.0",
|
"react-native-tab-view": "2.13.0",
|
||||||
"react-native-unimodules": "^0.7.0",
|
"react-native-unimodules": "^0.7.0",
|
||||||
"react-native-web": "^0.11.7",
|
"react-native-web": "^0.11.7"
|
||||||
"scheduler": "^0.18.0",
|
|
||||||
"shortid": "^2.2.15",
|
|
||||||
"use-subscription": "^1.3.0"
|
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@babel/core": "^7.7.7",
|
"@babel/core": "^7.7.7",
|
||||||
@@ -46,30 +37,7 @@
|
|||||||
"@types/react": "^16.9.17",
|
"@types/react": "^16.9.17",
|
||||||
"@types/react-native": "^0.60.30",
|
"@types/react-native": "^0.60.30",
|
||||||
"babel-preset-expo": "^8.0.0",
|
"babel-preset-expo": "^8.0.0",
|
||||||
"detox": "^15.0.0",
|
|
||||||
"expo-cli": "^3.11.5",
|
"expo-cli": "^3.11.5",
|
||||||
"jest": "^24.9.0",
|
|
||||||
"typescript": "^3.7.4"
|
"typescript": "^3.7.4"
|
||||||
},
|
|
||||||
"detox": {
|
|
||||||
"test-runner": "jest",
|
|
||||||
"configurations": {
|
|
||||||
"ios.sim.debug": {
|
|
||||||
"binaryPath": "ios/build/Build/Products/Debug-iphonesimulator/ReactNavigationExample.app",
|
|
||||||
"build": "set -o pipefail; xcodebuild -workspace ios/ReactNavigationExample.xcworkspace -scheme ReactNavigationExample -configuration Debug -sdk iphonesimulator -derivedDataPath ios/build",
|
|
||||||
"type": "ios.simulator",
|
|
||||||
"device": {
|
|
||||||
"type": "iPhone 11 Pro"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"ios.sim.release": {
|
|
||||||
"binaryPath": "ios/build/Build/Products/Release-iphonesimulator/ReactNavigationExample.app",
|
|
||||||
"build": "export RCT_NO_LAUNCH_PACKAGER=true; set -o pipefail; xcodebuild -workspace ios/ReactNavigationExample.xcworkspace -scheme ReactNavigationExample -configuration Release -sdk iphonesimulator -derivedDataPath ios/build",
|
|
||||||
"type": "ios.simulator",
|
|
||||||
"device": {
|
|
||||||
"type": "iPhone 11 Pro"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
export default [];
|
export default ['rne://127.0.0.1:19000/--/'];
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import * as React from 'react';
|
import * as React from 'react';
|
||||||
import { View, TextInput, ActivityIndicator, StyleSheet } from 'react-native';
|
import { View, TextInput, ActivityIndicator, StyleSheet } from 'react-native';
|
||||||
import { Title, Button } from 'react-native-paper';
|
import { Title, Button } from 'react-native-paper';
|
||||||
import { ParamListBase } from '@react-navigation/native';
|
import { useTheme, ParamListBase } from '@react-navigation/native';
|
||||||
import {
|
import {
|
||||||
createStackNavigator,
|
createStackNavigator,
|
||||||
HeaderBackButton,
|
HeaderBackButton,
|
||||||
@@ -40,11 +40,25 @@ const SplashScreen = () => {
|
|||||||
|
|
||||||
const SignInScreen = () => {
|
const SignInScreen = () => {
|
||||||
const { signIn } = React.useContext(AuthContext);
|
const { signIn } = React.useContext(AuthContext);
|
||||||
|
const { colors } = useTheme();
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<View style={styles.content}>
|
<View style={styles.content}>
|
||||||
<TextInput placeholder="Username" style={styles.input} />
|
<TextInput
|
||||||
<TextInput placeholder="Password" secureTextEntry style={styles.input} />
|
placeholder="Username"
|
||||||
|
style={[
|
||||||
|
styles.input,
|
||||||
|
{ backgroundColor: colors.card, color: colors.text },
|
||||||
|
]}
|
||||||
|
/>
|
||||||
|
<TextInput
|
||||||
|
placeholder="Password"
|
||||||
|
secureTextEntry
|
||||||
|
style={[
|
||||||
|
styles.input,
|
||||||
|
{ backgroundColor: colors.card, color: colors.text },
|
||||||
|
]}
|
||||||
|
/>
|
||||||
<Button mode="contained" onPress={signIn} style={styles.button}>
|
<Button mode="contained" onPress={signIn} style={styles.button}>
|
||||||
Sign in
|
Sign in
|
||||||
</Button>
|
</Button>
|
||||||
@@ -73,6 +87,7 @@ type Props = {
|
|||||||
|
|
||||||
type State = {
|
type State = {
|
||||||
isLoading: boolean;
|
isLoading: boolean;
|
||||||
|
isSignout: boolean;
|
||||||
userToken: undefined | string;
|
userToken: undefined | string;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -94,17 +109,20 @@ export default function SimpleStackScreen({ navigation }: Props) {
|
|||||||
case 'SIGN_IN':
|
case 'SIGN_IN':
|
||||||
return {
|
return {
|
||||||
...prevState,
|
...prevState,
|
||||||
|
isSignout: false,
|
||||||
userToken: action.token,
|
userToken: action.token,
|
||||||
};
|
};
|
||||||
case 'SIGN_OUT':
|
case 'SIGN_OUT':
|
||||||
return {
|
return {
|
||||||
...prevState,
|
...prevState,
|
||||||
|
isSignout: true,
|
||||||
userToken: undefined,
|
userToken: undefined,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
isLoading: true,
|
isLoading: true,
|
||||||
|
isSignout: false,
|
||||||
userToken: undefined,
|
userToken: undefined,
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
@@ -147,7 +165,10 @@ export default function SimpleStackScreen({ navigation }: Props) {
|
|||||||
) : state.userToken === undefined ? (
|
) : state.userToken === undefined ? (
|
||||||
<SimpleStack.Screen
|
<SimpleStack.Screen
|
||||||
name="SignIn"
|
name="SignIn"
|
||||||
options={{ title: 'Sign in' }}
|
options={{
|
||||||
|
title: 'Sign in',
|
||||||
|
animationTypeForReplace: state.isSignout ? 'pop' : 'push',
|
||||||
|
}}
|
||||||
component={SignInScreen}
|
component={SignInScreen}
|
||||||
/>
|
/>
|
||||||
) : (
|
) : (
|
||||||
@@ -171,7 +192,6 @@ const styles = StyleSheet.create({
|
|||||||
input: {
|
input: {
|
||||||
margin: 8,
|
margin: 8,
|
||||||
padding: 10,
|
padding: 10,
|
||||||
backgroundColor: 'white',
|
|
||||||
borderRadius: 3,
|
borderRadius: 3,
|
||||||
borderWidth: StyleSheet.hairlineWidth,
|
borderWidth: StyleSheet.hairlineWidth,
|
||||||
borderColor: 'rgba(0, 0, 0, 0.08)',
|
borderColor: 'rgba(0, 0, 0, 0.08)',
|
||||||
|
|||||||
56
example/src/Screens/DynamicTabs.tsx
Normal file
@@ -0,0 +1,56 @@
|
|||||||
|
import * as React from 'react';
|
||||||
|
import { View, StyleSheet } from 'react-native';
|
||||||
|
import { Title, Button } from 'react-native-paper';
|
||||||
|
import { Feather } from '@expo/vector-icons';
|
||||||
|
import { createBottomTabNavigator } from '@react-navigation/bottom-tabs';
|
||||||
|
|
||||||
|
type BottomTabParams = {
|
||||||
|
[key: string]: undefined;
|
||||||
|
};
|
||||||
|
|
||||||
|
const BottomTabs = createBottomTabNavigator<BottomTabParams>();
|
||||||
|
|
||||||
|
export default function BottomTabsScreen() {
|
||||||
|
const [tabs, setTabs] = React.useState([0, 1]);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<BottomTabs.Navigator>
|
||||||
|
{tabs.map(i => (
|
||||||
|
<BottomTabs.Screen
|
||||||
|
key={i}
|
||||||
|
name={`tab-${i}`}
|
||||||
|
options={{
|
||||||
|
title: `Tab ${i}`,
|
||||||
|
tabBarIcon: ({ color, size }) => (
|
||||||
|
<Feather name="octagon" color={color} size={size} />
|
||||||
|
),
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{() => (
|
||||||
|
<View style={styles.container}>
|
||||||
|
<Title>Tab {i}</Title>
|
||||||
|
<Button onPress={() => setTabs(tabs => [...tabs, tabs.length])}>
|
||||||
|
Add a tab
|
||||||
|
</Button>
|
||||||
|
<Button
|
||||||
|
onPress={() =>
|
||||||
|
setTabs(tabs => (tabs.length > 1 ? tabs.slice(0, -1) : tabs))
|
||||||
|
}
|
||||||
|
>
|
||||||
|
Remove a tab
|
||||||
|
</Button>
|
||||||
|
</View>
|
||||||
|
)}
|
||||||
|
</BottomTabs.Screen>
|
||||||
|
))}
|
||||||
|
</BottomTabs.Navigator>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
const styles = StyleSheet.create({
|
||||||
|
container: {
|
||||||
|
flex: 1,
|
||||||
|
alignItems: 'center',
|
||||||
|
justifyContent: 'center',
|
||||||
|
},
|
||||||
|
});
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
import * as React from 'react';
|
import * as React from 'react';
|
||||||
import { View, StyleSheet } from 'react-native';
|
import { View, StyleSheet, ScrollView } from 'react-native';
|
||||||
import { Button } from 'react-native-paper';
|
import { Button } from 'react-native-paper';
|
||||||
import { RouteProp, ParamListBase } from '@react-navigation/native';
|
import { RouteProp, ParamListBase } from '@react-navigation/native';
|
||||||
import {
|
import {
|
||||||
@@ -25,7 +25,7 @@ const ArticleScreen = ({
|
|||||||
route: RouteProp<ModalStackParams, 'Article'>;
|
route: RouteProp<ModalStackParams, 'Article'>;
|
||||||
}) => {
|
}) => {
|
||||||
return (
|
return (
|
||||||
<React.Fragment>
|
<ScrollView>
|
||||||
<View style={styles.buttons}>
|
<View style={styles.buttons}>
|
||||||
<Button
|
<Button
|
||||||
mode="contained"
|
mode="contained"
|
||||||
@@ -42,14 +42,14 @@ const ArticleScreen = ({
|
|||||||
Go back
|
Go back
|
||||||
</Button>
|
</Button>
|
||||||
</View>
|
</View>
|
||||||
<Article author={{ name: route.params.author }} />
|
<Article author={{ name: route.params.author }} scrollEnabled={false} />
|
||||||
</React.Fragment>
|
</ScrollView>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
const AlbumsScreen = ({ navigation }: { navigation: ModalStackNavigation }) => {
|
const AlbumsScreen = ({ navigation }: { navigation: ModalStackNavigation }) => {
|
||||||
return (
|
return (
|
||||||
<React.Fragment>
|
<ScrollView>
|
||||||
<View style={styles.buttons}>
|
<View style={styles.buttons}>
|
||||||
<Button
|
<Button
|
||||||
mode="contained"
|
mode="contained"
|
||||||
@@ -66,8 +66,8 @@ const AlbumsScreen = ({ navigation }: { navigation: ModalStackNavigation }) => {
|
|||||||
Go back
|
Go back
|
||||||
</Button>
|
</Button>
|
||||||
</View>
|
</View>
|
||||||
<Albums />
|
<Albums scrollEnabled={false} />
|
||||||
</React.Fragment>
|
</ScrollView>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -137,7 +137,7 @@ const AlbumsScreen = ({
|
|||||||
}: {
|
}: {
|
||||||
navigation: NativeStackNavigation;
|
navigation: NativeStackNavigation;
|
||||||
}) => (
|
}) => (
|
||||||
<React.Fragment>
|
<ScrollView>
|
||||||
<View style={styles.buttons}>
|
<View style={styles.buttons}>
|
||||||
<Button
|
<Button
|
||||||
mode="contained"
|
mode="contained"
|
||||||
@@ -154,8 +154,8 @@ const AlbumsScreen = ({
|
|||||||
Go back
|
Go back
|
||||||
</Button>
|
</Button>
|
||||||
</View>
|
</View>
|
||||||
<Albums />
|
<Albums scrollEnabled={false} />
|
||||||
</React.Fragment>
|
</ScrollView>
|
||||||
);
|
);
|
||||||
|
|
||||||
const NativeStack = createNativeStackNavigator<NativeStackParams>();
|
const NativeStack = createNativeStackNavigator<NativeStackParams>();
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import * as React from 'react';
|
import * as React from 'react';
|
||||||
import { View, StyleSheet } from 'react-native';
|
import { View, StyleSheet, ScrollView } from 'react-native';
|
||||||
import { Button } from 'react-native-paper';
|
import { Button } from 'react-native-paper';
|
||||||
import { RouteProp, ParamListBase } from '@react-navigation/native';
|
import { RouteProp, ParamListBase } from '@react-navigation/native';
|
||||||
import {
|
import {
|
||||||
@@ -8,9 +8,11 @@ import {
|
|||||||
} from '@react-navigation/stack';
|
} from '@react-navigation/stack';
|
||||||
import Article from '../Shared/Article';
|
import Article from '../Shared/Article';
|
||||||
import Albums from '../Shared/Albums';
|
import Albums from '../Shared/Albums';
|
||||||
|
import NewsFeed from '../Shared/NewsFeed';
|
||||||
|
|
||||||
type SimpleStackParams = {
|
type SimpleStackParams = {
|
||||||
Article: { author: string };
|
Article: { author: string };
|
||||||
|
NewsFeed: undefined;
|
||||||
Album: undefined;
|
Album: undefined;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -24,14 +26,42 @@ const ArticleScreen = ({
|
|||||||
route: RouteProp<SimpleStackParams, 'Article'>;
|
route: RouteProp<SimpleStackParams, 'Article'>;
|
||||||
}) => {
|
}) => {
|
||||||
return (
|
return (
|
||||||
<React.Fragment>
|
<ScrollView>
|
||||||
<View style={styles.buttons}>
|
<View style={styles.buttons}>
|
||||||
<Button
|
<Button
|
||||||
mode="contained"
|
mode="contained"
|
||||||
onPress={() => navigation.push('Album')}
|
onPress={() => navigation.replace('NewsFeed')}
|
||||||
style={styles.button}
|
style={styles.button}
|
||||||
>
|
>
|
||||||
Push album
|
Replace with feed
|
||||||
|
</Button>
|
||||||
|
<Button
|
||||||
|
mode="outlined"
|
||||||
|
onPress={() => navigation.pop()}
|
||||||
|
style={styles.button}
|
||||||
|
>
|
||||||
|
Pop screen
|
||||||
|
</Button>
|
||||||
|
</View>
|
||||||
|
<Article author={{ name: route.params.author }} scrollEnabled={false} />
|
||||||
|
</ScrollView>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
const NewsFeedScreen = ({
|
||||||
|
navigation,
|
||||||
|
}: {
|
||||||
|
navigation: SimpleStackNavigation;
|
||||||
|
}) => {
|
||||||
|
return (
|
||||||
|
<ScrollView>
|
||||||
|
<View style={styles.buttons}>
|
||||||
|
<Button
|
||||||
|
mode="contained"
|
||||||
|
onPress={() => navigation.navigate('Album')}
|
||||||
|
style={styles.button}
|
||||||
|
>
|
||||||
|
Navigate to album
|
||||||
</Button>
|
</Button>
|
||||||
<Button
|
<Button
|
||||||
mode="outlined"
|
mode="outlined"
|
||||||
@@ -41,8 +71,8 @@ const ArticleScreen = ({
|
|||||||
Go back
|
Go back
|
||||||
</Button>
|
</Button>
|
||||||
</View>
|
</View>
|
||||||
<Article author={{ name: route.params.author }} />
|
<NewsFeed scrollEnabled={false} />
|
||||||
</React.Fragment>
|
</ScrollView>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -52,7 +82,7 @@ const AlbumsScreen = ({
|
|||||||
navigation: SimpleStackNavigation;
|
navigation: SimpleStackNavigation;
|
||||||
}) => {
|
}) => {
|
||||||
return (
|
return (
|
||||||
<React.Fragment>
|
<ScrollView>
|
||||||
<View style={styles.buttons}>
|
<View style={styles.buttons}>
|
||||||
<Button
|
<Button
|
||||||
mode="contained"
|
mode="contained"
|
||||||
@@ -63,14 +93,14 @@ const AlbumsScreen = ({
|
|||||||
</Button>
|
</Button>
|
||||||
<Button
|
<Button
|
||||||
mode="outlined"
|
mode="outlined"
|
||||||
onPress={() => navigation.goBack()}
|
onPress={() => navigation.pop(2)}
|
||||||
style={styles.button}
|
style={styles.button}
|
||||||
>
|
>
|
||||||
Go back
|
Pop by 2
|
||||||
</Button>
|
</Button>
|
||||||
</View>
|
</View>
|
||||||
<Albums />
|
<Albums scrollEnabled={false} />
|
||||||
</React.Fragment>
|
</ScrollView>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -95,6 +125,11 @@ export default function SimpleStackScreen({ navigation, ...rest }: Props) {
|
|||||||
})}
|
})}
|
||||||
initialParams={{ author: 'Gandalf' }}
|
initialParams={{ author: 'Gandalf' }}
|
||||||
/>
|
/>
|
||||||
|
<SimpleStack.Screen
|
||||||
|
name="NewsFeed"
|
||||||
|
component={NewsFeedScreen}
|
||||||
|
options={{ title: 'Feed' }}
|
||||||
|
/>
|
||||||
<SimpleStack.Screen
|
<SimpleStack.Screen
|
||||||
name="Album"
|
name="Album"
|
||||||
component={AlbumsScreen}
|
component={AlbumsScreen}
|
||||||
|
|||||||
158
example/src/Screens/StackHeaderCustomization.tsx
Normal file
@@ -0,0 +1,158 @@
|
|||||||
|
import * as React from 'react';
|
||||||
|
import { View, StyleSheet, ScrollView, Alert, Platform } from 'react-native';
|
||||||
|
import { Button, Appbar } from 'react-native-paper';
|
||||||
|
import { BlurView } from 'expo-blur';
|
||||||
|
import { MaterialCommunityIcons } from '@expo/vector-icons';
|
||||||
|
import { RouteProp, ParamListBase } from '@react-navigation/native';
|
||||||
|
import {
|
||||||
|
createStackNavigator,
|
||||||
|
StackNavigationProp,
|
||||||
|
HeaderBackground,
|
||||||
|
useHeaderHeight,
|
||||||
|
} from '@react-navigation/stack';
|
||||||
|
import Article from '../Shared/Article';
|
||||||
|
import Albums from '../Shared/Albums';
|
||||||
|
|
||||||
|
type SimpleStackParams = {
|
||||||
|
Article: { author: string };
|
||||||
|
Album: undefined;
|
||||||
|
};
|
||||||
|
|
||||||
|
type SimpleStackNavigation = StackNavigationProp<SimpleStackParams>;
|
||||||
|
|
||||||
|
const ArticleScreen = ({
|
||||||
|
navigation,
|
||||||
|
route,
|
||||||
|
}: {
|
||||||
|
navigation: SimpleStackNavigation;
|
||||||
|
route: RouteProp<SimpleStackParams, 'Article'>;
|
||||||
|
}) => {
|
||||||
|
return (
|
||||||
|
<ScrollView>
|
||||||
|
<View style={styles.buttons}>
|
||||||
|
<Button
|
||||||
|
mode="contained"
|
||||||
|
onPress={() => navigation.push('Album')}
|
||||||
|
style={styles.button}
|
||||||
|
>
|
||||||
|
Push album
|
||||||
|
</Button>
|
||||||
|
<Button
|
||||||
|
mode="outlined"
|
||||||
|
onPress={() => navigation.goBack()}
|
||||||
|
style={styles.button}
|
||||||
|
>
|
||||||
|
Go back
|
||||||
|
</Button>
|
||||||
|
</View>
|
||||||
|
<Article author={{ name: route.params.author }} scrollEnabled={false} />
|
||||||
|
</ScrollView>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
const AlbumsScreen = ({
|
||||||
|
navigation,
|
||||||
|
}: {
|
||||||
|
navigation: SimpleStackNavigation;
|
||||||
|
}) => {
|
||||||
|
const headerHeight = useHeaderHeight();
|
||||||
|
|
||||||
|
return (
|
||||||
|
<ScrollView contentContainerStyle={{ paddingTop: headerHeight }}>
|
||||||
|
<View style={styles.buttons}>
|
||||||
|
<Button
|
||||||
|
mode="contained"
|
||||||
|
onPress={() => navigation.push('Article', { author: 'Babel fish' })}
|
||||||
|
style={styles.button}
|
||||||
|
>
|
||||||
|
Push article
|
||||||
|
</Button>
|
||||||
|
<Button
|
||||||
|
mode="outlined"
|
||||||
|
onPress={() => navigation.goBack()}
|
||||||
|
style={styles.button}
|
||||||
|
>
|
||||||
|
Go back
|
||||||
|
</Button>
|
||||||
|
</View>
|
||||||
|
<Albums scrollEnabled={false} />
|
||||||
|
</ScrollView>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
const SimpleStack = createStackNavigator<SimpleStackParams>();
|
||||||
|
|
||||||
|
type Props = Partial<React.ComponentProps<typeof SimpleStack.Navigator>> & {
|
||||||
|
navigation: StackNavigationProp<ParamListBase>;
|
||||||
|
};
|
||||||
|
|
||||||
|
export default function SimpleStackScreen({ navigation, ...rest }: Props) {
|
||||||
|
navigation.setOptions({
|
||||||
|
headerShown: false,
|
||||||
|
});
|
||||||
|
|
||||||
|
return (
|
||||||
|
<SimpleStack.Navigator {...rest}>
|
||||||
|
<SimpleStack.Screen
|
||||||
|
name="Article"
|
||||||
|
component={ArticleScreen}
|
||||||
|
options={({ route }) => ({
|
||||||
|
title: `Article by ${route.params?.author}`,
|
||||||
|
headerTintColor: '#fff',
|
||||||
|
headerStyle: { backgroundColor: '#ff005d' },
|
||||||
|
headerBackTitleVisible: false,
|
||||||
|
headerTitleAlign: 'center',
|
||||||
|
headerBackImage: ({ tintColor }) => (
|
||||||
|
<MaterialCommunityIcons
|
||||||
|
name="arrow-left-circle-outline"
|
||||||
|
color={tintColor}
|
||||||
|
size={24}
|
||||||
|
style={{ marginHorizontal: Platform.OS === 'ios' ? 8 : 0 }}
|
||||||
|
/>
|
||||||
|
),
|
||||||
|
headerRight: ({ tintColor }) => (
|
||||||
|
<Appbar.Action
|
||||||
|
color={tintColor}
|
||||||
|
icon="dots-horizontal-circle-outline"
|
||||||
|
onPress={() =>
|
||||||
|
Alert.alert(
|
||||||
|
'Never gonna give you up!',
|
||||||
|
'Never gonna let you down! Never gonna run around and desert you!'
|
||||||
|
)
|
||||||
|
}
|
||||||
|
/>
|
||||||
|
),
|
||||||
|
})}
|
||||||
|
initialParams={{ author: 'Gandalf' }}
|
||||||
|
/>
|
||||||
|
<SimpleStack.Screen
|
||||||
|
name="Album"
|
||||||
|
component={AlbumsScreen}
|
||||||
|
options={{
|
||||||
|
title: 'Album',
|
||||||
|
headerBackTitle: 'Back',
|
||||||
|
headerTransparent: true,
|
||||||
|
headerBackground: () => (
|
||||||
|
<HeaderBackground style={{ backgroundColor: 'transparent' }}>
|
||||||
|
<BlurView
|
||||||
|
tint="light"
|
||||||
|
intensity={75}
|
||||||
|
style={StyleSheet.absoluteFill}
|
||||||
|
/>
|
||||||
|
</HeaderBackground>
|
||||||
|
),
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
</SimpleStack.Navigator>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
const styles = StyleSheet.create({
|
||||||
|
buttons: {
|
||||||
|
flexDirection: 'row',
|
||||||
|
padding: 8,
|
||||||
|
},
|
||||||
|
button: {
|
||||||
|
margin: 8,
|
||||||
|
},
|
||||||
|
});
|
||||||
154
example/src/Screens/StackTransparent.tsx
Normal file
@@ -0,0 +1,154 @@
|
|||||||
|
import * as React from 'react';
|
||||||
|
import { View, StyleSheet, ScrollView } from 'react-native';
|
||||||
|
import { Button, Paragraph } from 'react-native-paper';
|
||||||
|
import { RouteProp, ParamListBase, useTheme } from '@react-navigation/native';
|
||||||
|
import {
|
||||||
|
createStackNavigator,
|
||||||
|
StackNavigationProp,
|
||||||
|
} from '@react-navigation/stack';
|
||||||
|
import Article from '../Shared/Article';
|
||||||
|
|
||||||
|
type SimpleStackParams = {
|
||||||
|
Article: { author: string };
|
||||||
|
Dialog: undefined;
|
||||||
|
};
|
||||||
|
|
||||||
|
type SimpleStackNavigation = StackNavigationProp<SimpleStackParams>;
|
||||||
|
|
||||||
|
const ArticleScreen = ({
|
||||||
|
navigation,
|
||||||
|
route,
|
||||||
|
}: {
|
||||||
|
navigation: SimpleStackNavigation;
|
||||||
|
route: RouteProp<SimpleStackParams, 'Article'>;
|
||||||
|
}) => {
|
||||||
|
return (
|
||||||
|
<ScrollView>
|
||||||
|
<View style={styles.buttons}>
|
||||||
|
<Button
|
||||||
|
mode="contained"
|
||||||
|
onPress={() => navigation.push('Dialog')}
|
||||||
|
style={styles.button}
|
||||||
|
>
|
||||||
|
Show Dialog
|
||||||
|
</Button>
|
||||||
|
<Button
|
||||||
|
mode="outlined"
|
||||||
|
onPress={() => navigation.goBack()}
|
||||||
|
style={styles.button}
|
||||||
|
>
|
||||||
|
Go back
|
||||||
|
</Button>
|
||||||
|
</View>
|
||||||
|
<Article author={{ name: route.params.author }} scrollEnabled={false} />
|
||||||
|
</ScrollView>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
const DialogScreen = ({
|
||||||
|
navigation,
|
||||||
|
}: {
|
||||||
|
navigation: SimpleStackNavigation;
|
||||||
|
}) => {
|
||||||
|
const { colors } = useTheme();
|
||||||
|
|
||||||
|
return (
|
||||||
|
<View style={styles.container}>
|
||||||
|
<View style={[styles.dialog, { backgroundColor: colors.card }]}>
|
||||||
|
<Paragraph>
|
||||||
|
Mise en place is a French term that literally means “put in place.” It
|
||||||
|
also refers to a way cooks in professional kitchens and restaurants
|
||||||
|
set up their work stations—first by gathering all ingredients for a
|
||||||
|
recipes, partially preparing them (like measuring out and chopping),
|
||||||
|
and setting them all near each other. Setting up mise en place before
|
||||||
|
cooking is another top tip for home cooks, as it seriously helps with
|
||||||
|
organization. It’ll pretty much guarantee you never forget to add an
|
||||||
|
ingredient and save you time from running back and forth from the
|
||||||
|
pantry ten times.
|
||||||
|
</Paragraph>
|
||||||
|
<Button style={styles.close} compact onPress={navigation.goBack}>
|
||||||
|
Okay
|
||||||
|
</Button>
|
||||||
|
</View>
|
||||||
|
</View>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
const SimpleStack = createStackNavigator<SimpleStackParams>();
|
||||||
|
|
||||||
|
type Props = Partial<React.ComponentProps<typeof SimpleStack.Navigator>> & {
|
||||||
|
navigation: StackNavigationProp<ParamListBase>;
|
||||||
|
};
|
||||||
|
|
||||||
|
export default function SimpleStackScreen({ navigation, ...rest }: Props) {
|
||||||
|
navigation.setOptions({
|
||||||
|
headerShown: false,
|
||||||
|
});
|
||||||
|
|
||||||
|
return (
|
||||||
|
<SimpleStack.Navigator mode="modal" {...rest}>
|
||||||
|
<SimpleStack.Screen
|
||||||
|
name="Article"
|
||||||
|
component={ArticleScreen}
|
||||||
|
initialParams={{ author: 'Gandalf' }}
|
||||||
|
/>
|
||||||
|
<SimpleStack.Screen
|
||||||
|
name="Dialog"
|
||||||
|
component={DialogScreen}
|
||||||
|
options={{
|
||||||
|
headerShown: false,
|
||||||
|
cardStyle: { backgroundColor: 'transparent' },
|
||||||
|
cardOverlayEnabled: true,
|
||||||
|
cardStyleInterpolator: ({ current: { progress } }) => ({
|
||||||
|
cardStyle: {
|
||||||
|
opacity: progress.interpolate({
|
||||||
|
inputRange: [0, 0.5, 0.9, 1],
|
||||||
|
outputRange: [0, 0.25, 0.7, 1],
|
||||||
|
}),
|
||||||
|
transform: [
|
||||||
|
{
|
||||||
|
scale: progress.interpolate({
|
||||||
|
inputRange: [0, 1],
|
||||||
|
outputRange: [0.9, 1],
|
||||||
|
extrapolate: 'clamp',
|
||||||
|
}),
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
overlayStyle: {
|
||||||
|
opacity: progress.interpolate({
|
||||||
|
inputRange: [0, 1],
|
||||||
|
outputRange: [0, 0.5],
|
||||||
|
extrapolate: 'clamp',
|
||||||
|
}),
|
||||||
|
},
|
||||||
|
}),
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
</SimpleStack.Navigator>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
const styles = StyleSheet.create({
|
||||||
|
buttons: {
|
||||||
|
flexDirection: 'row',
|
||||||
|
padding: 8,
|
||||||
|
},
|
||||||
|
button: {
|
||||||
|
margin: 8,
|
||||||
|
},
|
||||||
|
container: {
|
||||||
|
flex: 1,
|
||||||
|
alignItems: 'center',
|
||||||
|
justifyContent: 'center',
|
||||||
|
},
|
||||||
|
dialog: {
|
||||||
|
padding: 16,
|
||||||
|
width: '90%',
|
||||||
|
maxWidth: 400,
|
||||||
|
borderRadius: 3,
|
||||||
|
},
|
||||||
|
close: {
|
||||||
|
alignSelf: 'flex-end',
|
||||||
|
},
|
||||||
|
});
|
||||||
@@ -1,53 +1,90 @@
|
|||||||
/* eslint-disable import/no-commonjs */
|
/* eslint-disable import/no-commonjs */
|
||||||
|
|
||||||
import * as React from 'react';
|
import * as React from 'react';
|
||||||
import { Image, Dimensions, ScrollView, StyleSheet } from 'react-native';
|
import {
|
||||||
|
View,
|
||||||
|
Image,
|
||||||
|
ScrollView,
|
||||||
|
StyleSheet,
|
||||||
|
ScrollViewProps,
|
||||||
|
Dimensions,
|
||||||
|
Platform,
|
||||||
|
} from 'react-native';
|
||||||
import { useScrollToTop } from '@react-navigation/native';
|
import { useScrollToTop } from '@react-navigation/native';
|
||||||
|
|
||||||
const COVERS = [
|
const COVERS = [
|
||||||
require('../../assets/album-art-1.jpg'),
|
require('../../assets/album-art-01.jpg'),
|
||||||
require('../../assets/album-art-2.jpg'),
|
require('../../assets/album-art-02.jpg'),
|
||||||
require('../../assets/album-art-3.jpg'),
|
require('../../assets/album-art-03.jpg'),
|
||||||
require('../../assets/album-art-4.jpg'),
|
require('../../assets/album-art-04.jpg'),
|
||||||
require('../../assets/album-art-5.jpg'),
|
require('../../assets/album-art-05.jpg'),
|
||||||
require('../../assets/album-art-6.jpg'),
|
require('../../assets/album-art-06.jpg'),
|
||||||
require('../../assets/album-art-7.jpg'),
|
require('../../assets/album-art-07.jpg'),
|
||||||
require('../../assets/album-art-8.jpg'),
|
require('../../assets/album-art-08.jpg'),
|
||||||
|
require('../../assets/album-art-09.jpg'),
|
||||||
|
require('../../assets/album-art-10.jpg'),
|
||||||
|
require('../../assets/album-art-11.jpg'),
|
||||||
|
require('../../assets/album-art-12.jpg'),
|
||||||
|
require('../../assets/album-art-13.jpg'),
|
||||||
|
require('../../assets/album-art-14.jpg'),
|
||||||
|
require('../../assets/album-art-15.jpg'),
|
||||||
|
require('../../assets/album-art-16.jpg'),
|
||||||
|
require('../../assets/album-art-17.jpg'),
|
||||||
|
require('../../assets/album-art-18.jpg'),
|
||||||
|
require('../../assets/album-art-19.jpg'),
|
||||||
|
require('../../assets/album-art-20.jpg'),
|
||||||
|
require('../../assets/album-art-21.jpg'),
|
||||||
|
require('../../assets/album-art-22.jpg'),
|
||||||
|
require('../../assets/album-art-23.jpg'),
|
||||||
|
require('../../assets/album-art-24.jpg'),
|
||||||
];
|
];
|
||||||
|
|
||||||
export default function Albums() {
|
export default function Albums(props: Partial<ScrollViewProps>) {
|
||||||
const ref = React.useRef<ScrollView>(null);
|
const ref = React.useRef<ScrollView>(null);
|
||||||
|
|
||||||
useScrollToTop(ref);
|
useScrollToTop(ref);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<ScrollView
|
<ScrollView ref={ref} contentContainerStyle={styles.content} {...props}>
|
||||||
ref={ref}
|
|
||||||
style={styles.container}
|
|
||||||
contentContainerStyle={styles.content}
|
|
||||||
>
|
|
||||||
{COVERS.map((source, i) => (
|
{COVERS.map((source, i) => (
|
||||||
// eslint-disable-next-line react/no-array-index-key
|
// eslint-disable-next-line react/no-array-index-key
|
||||||
<Image key={i} source={source} style={styles.cover} />
|
<View key={i} style={styles.item}>
|
||||||
))}
|
<Image source={source} style={styles.photo} />
|
||||||
{COVERS.map((source, i) => (
|
</View>
|
||||||
// eslint-disable-next-line react/no-array-index-key
|
|
||||||
<Image key={i + 'F'} source={source} style={styles.cover} />
|
|
||||||
))}
|
))}
|
||||||
</ScrollView>
|
</ScrollView>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
const styles = StyleSheet.create({
|
const styles = StyleSheet.create({
|
||||||
container: {
|
|
||||||
backgroundColor: '#000',
|
|
||||||
},
|
|
||||||
content: {
|
content: {
|
||||||
flexDirection: 'row',
|
flexDirection: 'row',
|
||||||
flexWrap: 'wrap',
|
flexWrap: 'wrap',
|
||||||
},
|
},
|
||||||
cover: {
|
...Platform.select({
|
||||||
width: '50%',
|
web: {
|
||||||
height: Dimensions.get('window').width / 2,
|
content: {
|
||||||
|
display: 'grid' as 'none',
|
||||||
|
gridTemplateColumns: 'repeat(auto-fill, minmax(150px, 1fr))',
|
||||||
|
},
|
||||||
|
item: {
|
||||||
|
width: '100%',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
default: {
|
||||||
|
content: {
|
||||||
|
flexDirection: 'row',
|
||||||
|
flexWrap: 'wrap',
|
||||||
|
},
|
||||||
|
item: {
|
||||||
|
height: Dimensions.get('window').width / 2,
|
||||||
|
width: '50%',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}),
|
||||||
|
photo: {
|
||||||
|
flex: 1,
|
||||||
|
resizeMode: 'cover',
|
||||||
|
paddingTop: '100%',
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,8 +1,15 @@
|
|||||||
import * as React from 'react';
|
import * as React from 'react';
|
||||||
import { View, Text, Image, ScrollView, StyleSheet } from 'react-native';
|
import {
|
||||||
|
View,
|
||||||
|
Text,
|
||||||
|
Image,
|
||||||
|
ScrollView,
|
||||||
|
StyleSheet,
|
||||||
|
ScrollViewProps,
|
||||||
|
} from 'react-native';
|
||||||
import { useScrollToTop, useTheme } from '@react-navigation/native';
|
import { useScrollToTop, useTheme } from '@react-navigation/native';
|
||||||
|
|
||||||
type Props = {
|
type Props = Partial<ScrollViewProps> & {
|
||||||
date?: string;
|
date?: string;
|
||||||
author?: {
|
author?: {
|
||||||
name: string;
|
name: string;
|
||||||
@@ -14,6 +21,7 @@ export default function Article({
|
|||||||
author = {
|
author = {
|
||||||
name: 'Knowledge Bot',
|
name: 'Knowledge Bot',
|
||||||
},
|
},
|
||||||
|
...rest
|
||||||
}: Props) {
|
}: Props) {
|
||||||
const ref = React.useRef<ScrollView>(null);
|
const ref = React.useRef<ScrollView>(null);
|
||||||
|
|
||||||
@@ -26,6 +34,7 @@ export default function Article({
|
|||||||
ref={ref}
|
ref={ref}
|
||||||
style={{ backgroundColor: colors.card }}
|
style={{ backgroundColor: colors.card }}
|
||||||
contentContainerStyle={styles.content}
|
contentContainerStyle={styles.content}
|
||||||
|
{...rest}
|
||||||
>
|
>
|
||||||
<View style={styles.author}>
|
<View style={styles.author}>
|
||||||
<Image
|
<Image
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import {
|
|||||||
TextInput,
|
TextInput,
|
||||||
ScrollView,
|
ScrollView,
|
||||||
StyleSheet,
|
StyleSheet,
|
||||||
|
ScrollViewProps,
|
||||||
} from 'react-native';
|
} from 'react-native';
|
||||||
import { useScrollToTop, useTheme } from '@react-navigation/native';
|
import { useScrollToTop, useTheme } from '@react-navigation/native';
|
||||||
import Color from 'color';
|
import Color from 'color';
|
||||||
@@ -17,7 +18,7 @@ const MESSAGES = [
|
|||||||
'make me a sandwich',
|
'make me a sandwich',
|
||||||
];
|
];
|
||||||
|
|
||||||
export default function Chat() {
|
export default function Chat(props: Partial<ScrollViewProps>) {
|
||||||
const ref = React.useRef<ScrollView>(null);
|
const ref = React.useRef<ScrollView>(null);
|
||||||
|
|
||||||
useScrollToTop(ref);
|
useScrollToTop(ref);
|
||||||
@@ -29,6 +30,7 @@ export default function Chat() {
|
|||||||
<ScrollView
|
<ScrollView
|
||||||
style={styles.inverted}
|
style={styles.inverted}
|
||||||
contentContainerStyle={styles.content}
|
contentContainerStyle={styles.content}
|
||||||
|
{...props}
|
||||||
>
|
>
|
||||||
{MESSAGES.map((text, i) => {
|
{MESSAGES.map((text, i) => {
|
||||||
const odd = i % 2;
|
const odd = i % 2;
|
||||||
|
|||||||
146
example/src/Shared/NewsFeed.tsx
Normal file
@@ -0,0 +1,146 @@
|
|||||||
|
import * as React from 'react';
|
||||||
|
import {
|
||||||
|
View,
|
||||||
|
TextInput,
|
||||||
|
Image,
|
||||||
|
ScrollView,
|
||||||
|
StyleSheet,
|
||||||
|
ScrollViewProps,
|
||||||
|
} from 'react-native';
|
||||||
|
import { useScrollToTop, useTheme } from '@react-navigation/native';
|
||||||
|
import {
|
||||||
|
Card,
|
||||||
|
Text,
|
||||||
|
Avatar,
|
||||||
|
Subheading,
|
||||||
|
IconButton,
|
||||||
|
Divider,
|
||||||
|
} from 'react-native-paper';
|
||||||
|
import Color from 'color';
|
||||||
|
|
||||||
|
type Props = Partial<ScrollViewProps>;
|
||||||
|
|
||||||
|
const Author = () => {
|
||||||
|
return (
|
||||||
|
<View style={[styles.row, styles.attribution]}>
|
||||||
|
<Avatar.Image source={require('../../assets/avatar-1.png')} size={32} />
|
||||||
|
<Subheading style={styles.author}>Joke bot</Subheading>
|
||||||
|
</View>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
const Footer = () => {
|
||||||
|
return (
|
||||||
|
<View style={styles.row}>
|
||||||
|
<IconButton style={styles.icon} size={16} icon="heart-outline" />
|
||||||
|
<IconButton style={styles.icon} size={16} icon="comment-outline" />
|
||||||
|
<IconButton style={styles.icon} size={16} icon="share-outline" />
|
||||||
|
</View>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default function NewsFeed(props: Props) {
|
||||||
|
const ref = React.useRef<ScrollView>(null);
|
||||||
|
|
||||||
|
useScrollToTop(ref);
|
||||||
|
|
||||||
|
const { colors } = useTheme();
|
||||||
|
|
||||||
|
return (
|
||||||
|
<ScrollView ref={ref} {...props}>
|
||||||
|
<Card style={styles.card}>
|
||||||
|
<TextInput
|
||||||
|
placeholder="What's on your mind?"
|
||||||
|
placeholderTextColor={Color(colors.text)
|
||||||
|
.alpha(0.5)
|
||||||
|
.rgb()
|
||||||
|
.string()}
|
||||||
|
style={styles.input}
|
||||||
|
/>
|
||||||
|
</Card>
|
||||||
|
<Card style={styles.card}>
|
||||||
|
<Author />
|
||||||
|
<Card.Content style={styles.content}>
|
||||||
|
<Text>
|
||||||
|
If you aren't impressed with the picture of the first Black
|
||||||
|
Hole, you clearly don't understand the gravity of the
|
||||||
|
situation.
|
||||||
|
</Text>
|
||||||
|
</Card.Content>
|
||||||
|
<Divider />
|
||||||
|
<Footer />
|
||||||
|
</Card>
|
||||||
|
<Card style={styles.card}>
|
||||||
|
<Author />
|
||||||
|
<Card.Content style={styles.content}>
|
||||||
|
<Text>
|
||||||
|
I went to the zoo and I saw a baguette in a cage. I asked the
|
||||||
|
zookeeper about it and he said it was bread in captivity.
|
||||||
|
</Text>
|
||||||
|
</Card.Content>
|
||||||
|
<Image source={require('../../assets/book.jpg')} style={styles.cover} />
|
||||||
|
<Footer />
|
||||||
|
</Card>
|
||||||
|
<Card style={styles.card}>
|
||||||
|
<Author />
|
||||||
|
<Card.Content style={styles.content}>
|
||||||
|
<Text>Why didn't 4 ask 5 out? Because he was 2².</Text>
|
||||||
|
</Card.Content>
|
||||||
|
<Divider />
|
||||||
|
<Footer />
|
||||||
|
</Card>
|
||||||
|
<Card style={styles.card}>
|
||||||
|
<Author />
|
||||||
|
<Card.Content style={styles.content}>
|
||||||
|
<Text>
|
||||||
|
What did Master Yoda say when he first saw himself in 4k? HDMI.
|
||||||
|
</Text>
|
||||||
|
</Card.Content>
|
||||||
|
<Divider />
|
||||||
|
<Footer />
|
||||||
|
</Card>
|
||||||
|
<Card style={styles.card}>
|
||||||
|
<Author />
|
||||||
|
<Card.Content style={styles.content}>
|
||||||
|
<Text>
|
||||||
|
Someone broke into my house and stole 20% of my couch. Ouch!
|
||||||
|
</Text>
|
||||||
|
</Card.Content>
|
||||||
|
<Divider />
|
||||||
|
<Footer />
|
||||||
|
</Card>
|
||||||
|
</ScrollView>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
const styles = StyleSheet.create({
|
||||||
|
input: {
|
||||||
|
padding: 16,
|
||||||
|
backgroundColor: 'transparent',
|
||||||
|
margin: 0,
|
||||||
|
},
|
||||||
|
card: {
|
||||||
|
marginVertical: 8,
|
||||||
|
borderRadius: 0,
|
||||||
|
},
|
||||||
|
cover: {
|
||||||
|
height: 160,
|
||||||
|
borderRadius: 0,
|
||||||
|
},
|
||||||
|
content: {
|
||||||
|
marginBottom: 12,
|
||||||
|
},
|
||||||
|
attribution: {
|
||||||
|
margin: 12,
|
||||||
|
},
|
||||||
|
author: {
|
||||||
|
marginHorizontal: 8,
|
||||||
|
},
|
||||||
|
row: {
|
||||||
|
flexDirection: 'row',
|
||||||
|
alignItems: 'center',
|
||||||
|
},
|
||||||
|
icon: {
|
||||||
|
flex: 1,
|
||||||
|
},
|
||||||
|
});
|
||||||
26
example/src/Shared/SettingsItem.tsx
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
import * as React from 'react';
|
||||||
|
import { View } from 'react-native';
|
||||||
|
import { Subheading, Switch } from 'react-native-paper';
|
||||||
|
|
||||||
|
type Props = {
|
||||||
|
label: string;
|
||||||
|
value: boolean;
|
||||||
|
onValueChange: () => void;
|
||||||
|
};
|
||||||
|
|
||||||
|
export default function SettingsItem({ label, value, onValueChange }: Props) {
|
||||||
|
return (
|
||||||
|
<View
|
||||||
|
style={{
|
||||||
|
flexDirection: 'row',
|
||||||
|
alignItems: 'center',
|
||||||
|
justifyContent: 'space-between',
|
||||||
|
paddingHorizontal: 16,
|
||||||
|
paddingVertical: 12,
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<Subheading>{label}</Subheading>
|
||||||
|
<Switch value={value} onValueChange={onValueChange} />
|
||||||
|
</View>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -1,21 +1,20 @@
|
|||||||
import * as React from 'react';
|
import * as React from 'react';
|
||||||
import {
|
import {
|
||||||
View,
|
|
||||||
ScrollView,
|
ScrollView,
|
||||||
AsyncStorage,
|
AsyncStorage,
|
||||||
YellowBox,
|
YellowBox,
|
||||||
Platform,
|
Platform,
|
||||||
StatusBar,
|
StatusBar,
|
||||||
|
I18nManager,
|
||||||
} from 'react-native';
|
} from 'react-native';
|
||||||
|
import RNRestart from 'react-native-restart';
|
||||||
import { MaterialIcons } from '@expo/vector-icons';
|
import { MaterialIcons } from '@expo/vector-icons';
|
||||||
import {
|
import {
|
||||||
Provider as PaperProvider,
|
Provider as PaperProvider,
|
||||||
DefaultTheme as PaperLightTheme,
|
DefaultTheme as PaperLightTheme,
|
||||||
DarkTheme as PaperDarkTheme,
|
DarkTheme as PaperDarkTheme,
|
||||||
Subheading,
|
|
||||||
Appbar,
|
Appbar,
|
||||||
List,
|
List,
|
||||||
Switch,
|
|
||||||
Divider,
|
Divider,
|
||||||
} from 'react-native-paper';
|
} from 'react-native-paper';
|
||||||
import { Asset } from 'expo-asset';
|
import { Asset } from 'expo-asset';
|
||||||
@@ -23,7 +22,7 @@ import {
|
|||||||
InitialState,
|
InitialState,
|
||||||
useLinking,
|
useLinking,
|
||||||
NavigationContainerRef,
|
NavigationContainerRef,
|
||||||
NavigationNativeContainer,
|
NavigationContainer,
|
||||||
DefaultTheme,
|
DefaultTheme,
|
||||||
DarkTheme,
|
DarkTheme,
|
||||||
} from '@react-navigation/native';
|
} from '@react-navigation/native';
|
||||||
@@ -42,11 +41,16 @@ import LinkingPrefixes from './LinkingPrefixes';
|
|||||||
import SimpleStack from './Screens/SimpleStack';
|
import SimpleStack from './Screens/SimpleStack';
|
||||||
import NativeStack from './Screens/NativeStack';
|
import NativeStack from './Screens/NativeStack';
|
||||||
import ModalPresentationStack from './Screens/ModalPresentationStack';
|
import ModalPresentationStack from './Screens/ModalPresentationStack';
|
||||||
|
import StackTransparent from './Screens/StackTransparent';
|
||||||
|
import StackHeaderCustomization from './Screens/StackHeaderCustomization';
|
||||||
import BottomTabs from './Screens/BottomTabs';
|
import BottomTabs from './Screens/BottomTabs';
|
||||||
import MaterialTopTabsScreen from './Screens/MaterialTopTabs';
|
import MaterialTopTabsScreen from './Screens/MaterialTopTabs';
|
||||||
import MaterialBottomTabs from './Screens/MaterialBottomTabs';
|
import MaterialBottomTabs from './Screens/MaterialBottomTabs';
|
||||||
|
import DynamicTabs from './Screens/DynamicTabs';
|
||||||
import AuthFlow from './Screens/AuthFlow';
|
import AuthFlow from './Screens/AuthFlow';
|
||||||
import CompatAPI from './Screens/CompatAPI';
|
import CompatAPI from './Screens/CompatAPI';
|
||||||
|
import SettingsItem from './Shared/SettingsItem';
|
||||||
|
import { Updates } from 'expo';
|
||||||
|
|
||||||
YellowBox.ignoreWarnings(['Require cycle:', 'Warning: Async Storage']);
|
YellowBox.ignoreWarnings(['Require cycle:', 'Warning: Async Storage']);
|
||||||
|
|
||||||
@@ -68,6 +72,14 @@ const SCREENS = {
|
|||||||
title: 'Modal Presentation Stack',
|
title: 'Modal Presentation Stack',
|
||||||
component: ModalPresentationStack,
|
component: ModalPresentationStack,
|
||||||
},
|
},
|
||||||
|
StackTransparent: {
|
||||||
|
title: 'Transparent Stack',
|
||||||
|
component: StackTransparent,
|
||||||
|
},
|
||||||
|
StackHeaderCustomization: {
|
||||||
|
title: 'Header Customization in Stack',
|
||||||
|
component: StackHeaderCustomization,
|
||||||
|
},
|
||||||
BottomTabs: { title: 'Bottom Tabs', component: BottomTabs },
|
BottomTabs: { title: 'Bottom Tabs', component: BottomTabs },
|
||||||
MaterialTopTabs: {
|
MaterialTopTabs: {
|
||||||
title: 'Material Top Tabs',
|
title: 'Material Top Tabs',
|
||||||
@@ -77,6 +89,10 @@ const SCREENS = {
|
|||||||
title: 'Material Bottom Tabs',
|
title: 'Material Bottom Tabs',
|
||||||
component: MaterialBottomTabs,
|
component: MaterialBottomTabs,
|
||||||
},
|
},
|
||||||
|
DynamicTabs: {
|
||||||
|
title: 'Dynamic Tabs',
|
||||||
|
component: DynamicTabs,
|
||||||
|
},
|
||||||
AuthFlow: {
|
AuthFlow: {
|
||||||
title: 'Auth Flow',
|
title: 'Auth Flow',
|
||||||
component: AuthFlow,
|
component: AuthFlow,
|
||||||
@@ -101,22 +117,27 @@ export default function App() {
|
|||||||
// To test deep linking on, run the following in the Terminal:
|
// To test deep linking on, run the following in the Terminal:
|
||||||
// Android: adb shell am start -a android.intent.action.VIEW -d "exp://127.0.0.1:19000/--/simple-stack"
|
// Android: adb shell am start -a android.intent.action.VIEW -d "exp://127.0.0.1:19000/--/simple-stack"
|
||||||
// iOS: xcrun simctl openurl booted exp://127.0.0.1:19000/--/simple-stack
|
// iOS: xcrun simctl openurl booted exp://127.0.0.1:19000/--/simple-stack
|
||||||
|
// Android (bare): adb shell am start -a android.intent.action.VIEW -d "rne://127.0.0.1:19000/--/simple-stack"
|
||||||
|
// iOS (bare): xcrun simctl openurl booted rne://127.0.0.1:19000/--/simple-stack
|
||||||
// The first segment of the link is the the scheme + host (returned by `Linking.makeUrl`)
|
// The first segment of the link is the the scheme + host (returned by `Linking.makeUrl`)
|
||||||
const { getInitialState } = useLinking(containerRef, {
|
const { getInitialState } = useLinking(containerRef, {
|
||||||
prefixes: LinkingPrefixes,
|
prefixes: LinkingPrefixes,
|
||||||
config: {
|
config: {
|
||||||
Root: Object.keys(SCREENS).reduce<{ [key: string]: string }>(
|
Root: {
|
||||||
(acc, name) => {
|
path: 'root',
|
||||||
// Convert screen names such as SimpleStack to kebab case (simple-stack)
|
screens: Object.keys(SCREENS).reduce<{ [key: string]: string }>(
|
||||||
acc[name] = name
|
(acc, name) => {
|
||||||
.replace(/([A-Z]+)/g, '-$1')
|
// Convert screen names such as SimpleStack to kebab case (simple-stack)
|
||||||
.replace(/^-/, '')
|
acc[name] = name
|
||||||
.toLowerCase();
|
.replace(/([A-Z]+)/g, '-$1')
|
||||||
|
.replace(/^-/, '')
|
||||||
|
.toLowerCase();
|
||||||
|
|
||||||
return acc;
|
return acc;
|
||||||
},
|
},
|
||||||
{}
|
{}
|
||||||
),
|
),
|
||||||
|
},
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -132,7 +153,7 @@ export default function App() {
|
|||||||
try {
|
try {
|
||||||
let state = await getInitialState();
|
let state = await getInitialState();
|
||||||
|
|
||||||
if (state === undefined) {
|
if (Platform.OS !== 'web' && state === undefined) {
|
||||||
const savedState = await AsyncStorage.getItem(
|
const savedState = await AsyncStorage.getItem(
|
||||||
NAVIGATION_PERSISTENCE_KEY
|
NAVIGATION_PERSISTENCE_KEY
|
||||||
);
|
);
|
||||||
@@ -181,7 +202,7 @@ export default function App() {
|
|||||||
{Platform.OS === 'ios' && (
|
{Platform.OS === 'ios' && (
|
||||||
<StatusBar barStyle={theme.dark ? 'light-content' : 'dark-content'} />
|
<StatusBar barStyle={theme.dark ? 'light-content' : 'dark-content'} />
|
||||||
)}
|
)}
|
||||||
<NavigationNativeContainer
|
<NavigationContainer
|
||||||
ref={containerRef}
|
ref={containerRef}
|
||||||
initialState={initialState}
|
initialState={initialState}
|
||||||
onStateChange={state =>
|
onStateChange={state =>
|
||||||
@@ -233,34 +254,39 @@ export default function App() {
|
|||||||
<ScrollView
|
<ScrollView
|
||||||
style={{ backgroundColor: theme.colors.background }}
|
style={{ backgroundColor: theme.colors.background }}
|
||||||
>
|
>
|
||||||
<View
|
<SettingsItem
|
||||||
style={{
|
label="Right to left"
|
||||||
flexDirection: 'row',
|
value={I18nManager.isRTL}
|
||||||
alignItems: 'center',
|
onValueChange={() => {
|
||||||
justifyContent: 'space-between',
|
I18nManager.forceRTL(!I18nManager.isRTL);
|
||||||
padding: 16,
|
// @ts-ignore
|
||||||
|
if (global.Expo) {
|
||||||
|
Updates.reloadFromCache();
|
||||||
|
} else {
|
||||||
|
RNRestart.Restart();
|
||||||
|
}
|
||||||
}}
|
}}
|
||||||
>
|
/>
|
||||||
<Subheading>Dark theme</Subheading>
|
<Divider />
|
||||||
<Switch
|
<SettingsItem
|
||||||
value={theme.dark}
|
label="Dark theme"
|
||||||
onValueChange={() => {
|
value={theme.dark}
|
||||||
AsyncStorage.setItem(
|
onValueChange={() => {
|
||||||
THEME_PERSISTENCE_KEY,
|
AsyncStorage.setItem(
|
||||||
theme.dark ? 'light' : 'dark'
|
THEME_PERSISTENCE_KEY,
|
||||||
);
|
theme.dark ? 'light' : 'dark'
|
||||||
|
);
|
||||||
|
|
||||||
setTheme(t => (t.dark ? DefaultTheme : DarkTheme));
|
setTheme(t => (t.dark ? DefaultTheme : DarkTheme));
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
</View>
|
|
||||||
<Divider />
|
<Divider />
|
||||||
{(Object.keys(SCREENS) as (keyof typeof SCREENS)[]).map(
|
{(Object.keys(SCREENS) as (keyof typeof SCREENS)[]).map(
|
||||||
name => (
|
name => (
|
||||||
<List.Item
|
<List.Item
|
||||||
key={name}
|
key={name}
|
||||||
title={SCREENS[name].title}
|
title={SCREENS[name].title}
|
||||||
onPress={() => navigation.push(name)}
|
onPress={() => navigation.navigate(name)}
|
||||||
/>
|
/>
|
||||||
)
|
)
|
||||||
)}
|
)}
|
||||||
@@ -281,7 +307,7 @@ export default function App() {
|
|||||||
)}
|
)}
|
||||||
</Drawer.Screen>
|
</Drawer.Screen>
|
||||||
</Drawer.Navigator>
|
</Drawer.Navigator>
|
||||||
</NavigationNativeContainer>
|
</NavigationContainer>
|
||||||
</PaperProvider>
|
</PaperProvider>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,12 +4,14 @@ const createExpoWebpackConfigAsync = require('@expo/webpack-config');
|
|||||||
// eslint-disable-next-line import/no-extraneous-dependencies
|
// eslint-disable-next-line import/no-extraneous-dependencies
|
||||||
const ModuleScopePlugin = require('react-dev-utils/ModuleScopePlugin');
|
const ModuleScopePlugin = require('react-dev-utils/ModuleScopePlugin');
|
||||||
|
|
||||||
const node_modules = path.resolve(__dirname, 'node_modules');
|
const node_modules = path.resolve(__dirname, '..', 'node_modules');
|
||||||
const packages = path.resolve(__dirname, '..', 'packages');
|
const packages = path.resolve(__dirname, '..', 'packages');
|
||||||
|
|
||||||
module.exports = async function(env, argv) {
|
module.exports = async function(env, argv) {
|
||||||
const config = await createExpoWebpackConfigAsync(env, argv);
|
const config = await createExpoWebpackConfigAsync(env, argv);
|
||||||
|
|
||||||
|
config.context = path.resolve(__dirname, '..');
|
||||||
|
|
||||||
config.module.rules.push({
|
config.module.rules.push({
|
||||||
test: /\.(js|ts|tsx)$/,
|
test: /\.(js|ts|tsx)$/,
|
||||||
include: /(packages|example)\/.+/,
|
include: /(packages|example)\/.+/,
|
||||||
|
|||||||
26
package.json
@@ -34,6 +34,7 @@
|
|||||||
"codecov": "^3.6.1",
|
"codecov": "^3.6.1",
|
||||||
"commitlint": "^8.3.4",
|
"commitlint": "^8.3.4",
|
||||||
"core-js": "^3.6.2",
|
"core-js": "^3.6.2",
|
||||||
|
"detox": "^15.0.0",
|
||||||
"eslint": "^6.8.0",
|
"eslint": "^6.8.0",
|
||||||
"eslint-config-satya164": "^3.1.5",
|
"eslint-config-satya164": "^3.1.5",
|
||||||
"husky": "^4.0.1",
|
"husky": "^4.0.1",
|
||||||
@@ -63,12 +64,35 @@
|
|||||||
],
|
],
|
||||||
"moduleNameMapper": {
|
"moduleNameMapper": {
|
||||||
"@react-navigation/([^/]+)": "<rootDir>/packages/$1/src"
|
"@react-navigation/([^/]+)": "<rootDir>/packages/$1/src"
|
||||||
}
|
},
|
||||||
|
"preset": "react-native"
|
||||||
},
|
},
|
||||||
"prettier": {
|
"prettier": {
|
||||||
"tabWidth": 2,
|
"tabWidth": 2,
|
||||||
"useTabs": false,
|
"useTabs": false,
|
||||||
"singleQuote": true,
|
"singleQuote": true,
|
||||||
"trailingComma": "es5"
|
"trailingComma": "es5"
|
||||||
|
},
|
||||||
|
"detox": {
|
||||||
|
"test-runner": "jest",
|
||||||
|
"runner-config": "example/e2e/config.json",
|
||||||
|
"configurations": {
|
||||||
|
"ios.sim.debug": {
|
||||||
|
"binaryPath": "example/ios/build/Build/Products/Debug-iphonesimulator/ReactNavigationExample.app",
|
||||||
|
"build": "set -o pipefail; xcodebuild -workspace example/ios/ReactNavigationExample.xcworkspace -scheme ReactNavigationExample -configuration Debug -sdk iphonesimulator -derivedDataPath example/ios/build",
|
||||||
|
"type": "ios.simulator",
|
||||||
|
"device": {
|
||||||
|
"type": "iPhone 11 Pro"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"ios.sim.release": {
|
||||||
|
"binaryPath": "example/ios/build/Build/Products/Release-iphonesimulator/ReactNavigationExample.app",
|
||||||
|
"build": "export RCT_NO_LAUNCH_PACKAGER=true; set -o pipefail; xcodebuild -workspace example/ios/ReactNavigationExample.xcworkspace -scheme ReactNavigationExample -configuration Release -sdk iphonesimulator -derivedDataPath example/ios/build",
|
||||||
|
"type": "ios.simulator",
|
||||||
|
"device": {
|
||||||
|
"type": "iPhone 11 Pro"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,6 +3,98 @@
|
|||||||
All notable changes to this project will be documented in this file.
|
All notable changes to this project will be documented in this file.
|
||||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||||
|
|
||||||
|
# [5.0.0-alpha.44](https://github.com/react-navigation/navigation-ex/tree/master/packages/bottom-tabs/compare/@react-navigation/bottom-tabs@5.0.0-alpha.43...@react-navigation/bottom-tabs@5.0.0-alpha.44) (2020-02-04)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @react-navigation/bottom-tabs
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# [5.0.0-alpha.43](https://github.com/react-navigation/navigation-ex/tree/master/packages/bottom-tabs/compare/@react-navigation/bottom-tabs@5.0.0-alpha.42...@react-navigation/bottom-tabs@5.0.0-alpha.43) (2020-02-03)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @react-navigation/bottom-tabs
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# [5.0.0-alpha.42](https://github.com/react-navigation/navigation-ex/tree/master/packages/bottom-tabs/compare/@react-navigation/bottom-tabs@5.0.0-alpha.39...@react-navigation/bottom-tabs@5.0.0-alpha.42) (2020-02-02)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* add licenses ([0c159db](https://github.com/react-navigation/navigation-ex/tree/master/packages/bottom-tabs/commit/0c159db4c9bc85e83b5cfe6819ab2562669a4d8f))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# [5.0.0-alpha.40](https://github.com/react-navigation/navigation-ex/tree/master/packages/bottom-tabs/compare/@react-navigation/bottom-tabs@5.0.0-alpha.39...@react-navigation/bottom-tabs@5.0.0-alpha.40) (2020-02-02)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* add licenses ([0c159db](https://github.com/react-navigation/navigation-ex/tree/master/packages/bottom-tabs/commit/0c159db4c9bc85e83b5cfe6819ab2562669a4d8f))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# [5.0.0-alpha.39](https://github.com/react-navigation/navigation-ex/tree/master/packages/bottom-tabs/compare/@react-navigation/bottom-tabs@5.0.0-alpha.38...@react-navigation/bottom-tabs@5.0.0-alpha.39) (2020-01-24)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* use layout instead of dimensions for determining tab bar layout ([f1fe951](https://github.com/react-navigation/navigation-ex/tree/master/packages/bottom-tabs/commit/f1fe951cf9d602e1b6d4932e3c6c77bbeaaec5c0))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# [5.0.0-alpha.38](https://github.com/react-navigation/navigation-ex/tree/master/packages/bottom-tabs/compare/@react-navigation/bottom-tabs@5.0.0-alpha.37...@react-navigation/bottom-tabs@5.0.0-alpha.38) (2020-01-23)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* don't use native driver on web ([0a982ee](https://github.com/react-navigation/navigation-ex/tree/master/packages/bottom-tabs/commit/0a982ee6984b24c0ba053a30223e255f3835e050))
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* let the navigator specify if default can be prevented ([da67e13](https://github.com/react-navigation/navigation-ex/tree/master/packages/bottom-tabs/commit/da67e134d2157201360427d3c10da24f24cae7aa))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# [5.0.0-alpha.37](https://github.com/react-navigation/navigation-ex/tree/master/packages/bottom-tabs/compare/@react-navigation/bottom-tabs@5.0.0-alpha.36...@react-navigation/bottom-tabs@5.0.0-alpha.37) (2020-01-14)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @react-navigation/bottom-tabs
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# [5.0.0-alpha.36](https://github.com/react-navigation/navigation-ex/tree/master/packages/bottom-tabs/compare/@react-navigation/bottom-tabs@5.0.0-alpha.35...@react-navigation/bottom-tabs@5.0.0-alpha.36) (2020-01-13)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* make sure paths aren't aliased when building definitions ([65a5dac](https://github.com/react-navigation/navigation-ex/tree/master/packages/bottom-tabs/commit/65a5dac2bf887f4ba081ab15bd4c9870bb15697f)), closes [#265](https://github.com/react-navigation/navigation-ex/tree/master/packages/bottom-tabs/issues/265)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# [5.0.0-alpha.35](https://github.com/react-navigation/navigation-ex/tree/master/packages/bottom-tabs/compare/@react-navigation/bottom-tabs@5.0.0-alpha.34...@react-navigation/bottom-tabs@5.0.0-alpha.35) (2020-01-13)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @react-navigation/bottom-tabs
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# [5.0.0-alpha.34](https://github.com/react-navigation/navigation-ex/tree/master/packages/bottom-tabs/compare/@react-navigation/bottom-tabs@5.0.0-alpha.32...@react-navigation/bottom-tabs@5.0.0-alpha.34) (2020-01-09)
|
# [5.0.0-alpha.34](https://github.com/react-navigation/navigation-ex/tree/master/packages/bottom-tabs/compare/@react-navigation/bottom-tabs@5.0.0-alpha.32...@react-navigation/bottom-tabs@5.0.0-alpha.34) (2020-01-09)
|
||||||
|
|
||||||
**Note:** Version bump only for package @react-navigation/bottom-tabs
|
**Note:** Version bump only for package @react-navigation/bottom-tabs
|
||||||
|
|||||||
21
packages/bottom-tabs/LICENSE
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
MIT License
|
||||||
|
|
||||||
|
Copyright (c) 2017 React Navigation Contributors
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
@@ -10,17 +10,18 @@
|
|||||||
"android",
|
"android",
|
||||||
"tab"
|
"tab"
|
||||||
],
|
],
|
||||||
"version": "5.0.0-alpha.34",
|
"version": "5.0.0-alpha.44",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"repository": "https://github.com/react-navigation/navigation-ex/tree/master/packages/bottom-tabs",
|
"repository": "https://github.com/react-navigation/navigation-ex/tree/master/packages/bottom-tabs",
|
||||||
"main": "lib/commonjs/index.js",
|
"main": "lib/commonjs/index.js",
|
||||||
"react-native": "src/index.tsx",
|
"react-native": "src/index.tsx",
|
||||||
"module": "lib/module/index.js",
|
"module": "lib/module/index.js",
|
||||||
"types": "lib/typescript/bottom-tabs/src/index.d.ts",
|
"types": "lib/typescript/src/index.d.ts",
|
||||||
"files": [
|
"files": [
|
||||||
"src",
|
"src",
|
||||||
"lib"
|
"lib"
|
||||||
],
|
],
|
||||||
|
"sideEffects": false,
|
||||||
"publishConfig": {
|
"publishConfig": {
|
||||||
"access": "public"
|
"access": "public"
|
||||||
},
|
},
|
||||||
@@ -29,12 +30,12 @@
|
|||||||
"clean": "del lib"
|
"clean": "del lib"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@react-navigation/routers": "^5.0.0-alpha.22",
|
"@react-navigation/routers": "^5.0.0-alpha.32",
|
||||||
"color": "^3.1.2",
|
"color": "^3.1.2",
|
||||||
"react-native-iphone-x-helper": "^1.2.1"
|
"react-native-iphone-x-helper": "^1.2.1"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@react-native-community/bob": "^0.7.0",
|
"@react-native-community/bob": "^0.8.0",
|
||||||
"@types/color": "^3.0.1",
|
"@types/color": "^3.0.1",
|
||||||
"@types/react": "^16.9.17",
|
"@types/react": "^16.9.17",
|
||||||
"@types/react-native": "^0.60.30",
|
"@types/react-native": "^0.60.30",
|
||||||
@@ -56,7 +57,12 @@
|
|||||||
"targets": [
|
"targets": [
|
||||||
"commonjs",
|
"commonjs",
|
||||||
"module",
|
"module",
|
||||||
"typescript"
|
[
|
||||||
|
"typescript",
|
||||||
|
{
|
||||||
|
"project": "tsconfig.build.json"
|
||||||
|
}
|
||||||
|
]
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,11 +17,11 @@ export type BottomTabNavigationEventMap = {
|
|||||||
/**
|
/**
|
||||||
* Event which fires on tapping on the tab in the tab bar.
|
* Event which fires on tapping on the tab in the tab bar.
|
||||||
*/
|
*/
|
||||||
tabPress: undefined;
|
tabPress: { data: undefined; canPreventDefault: true };
|
||||||
/**
|
/**
|
||||||
* Event which fires on long press on the tab in the tab bar.
|
* Event which fires on long press on the tab in the tab bar.
|
||||||
*/
|
*/
|
||||||
tabLongPress: undefined;
|
tabLongPress: { data: undefined };
|
||||||
};
|
};
|
||||||
|
|
||||||
export type LabelPosition = 'beside-icon' | 'below-icon';
|
export type LabelPosition = 'beside-icon' | 'below-icon';
|
||||||
@@ -99,6 +99,12 @@ export type BottomTabNavigationOptions = {
|
|||||||
* Renders `TouchableWithoutFeedback` by default.
|
* Renders `TouchableWithoutFeedback` by default.
|
||||||
*/
|
*/
|
||||||
tabBarButton?: (props: BottomTabBarButtonProps) => React.ReactNode;
|
tabBarButton?: (props: BottomTabBarButtonProps) => React.ReactNode;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Whether this screen should be unmounted when navigating away from it.
|
||||||
|
* Defaults to `false`.
|
||||||
|
*/
|
||||||
|
unmountOnBlur?: boolean;
|
||||||
};
|
};
|
||||||
|
|
||||||
export type BottomTabDescriptor = Descriptor<
|
export type BottomTabDescriptor = Descriptor<
|
||||||
@@ -118,11 +124,6 @@ export type BottomTabNavigationConfig = {
|
|||||||
* Set it to `false` if you want to render all screens on initial render.
|
* Set it to `false` if you want to render all screens on initial render.
|
||||||
*/
|
*/
|
||||||
lazy?: boolean;
|
lazy?: boolean;
|
||||||
/**
|
|
||||||
* Whether a screen should be unmounted when navigating away from it.
|
|
||||||
* Defaults to `false`.
|
|
||||||
*/
|
|
||||||
unmountInactiveScreens?: boolean;
|
|
||||||
/**
|
/**
|
||||||
* Function that returns a React element to display as the tab bar.
|
* Function that returns a React element to display as the tab bar.
|
||||||
*/
|
*/
|
||||||
@@ -176,14 +177,9 @@ export type BottomTabBarOptions = {
|
|||||||
tabStyle?: StyleProp<ViewStyle>;
|
tabStyle?: StyleProp<ViewStyle>;
|
||||||
/**
|
/**
|
||||||
* Whether the label is renderd below the icon or beside the icon.
|
* Whether the label is renderd below the icon or beside the icon.
|
||||||
* When a function is passed, it receives the device dimensions to render the label differently.
|
|
||||||
* By default, in `vertical` orinetation, label is rendered below and in `horizontal` orientation, it's renderd beside.
|
* By default, in `vertical` orinetation, label is rendered below and in `horizontal` orientation, it's renderd beside.
|
||||||
*/
|
*/
|
||||||
labelPosition?:
|
labelPosition?: LabelPosition;
|
||||||
| LabelPosition
|
|
||||||
| ((options: {
|
|
||||||
dimensions: { height: number; width: number };
|
|
||||||
}) => LabelPosition);
|
|
||||||
/**
|
/**
|
||||||
* Whether the label position should adapt to the orientation.
|
* Whether the label position should adapt to the orientation.
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -27,6 +27,8 @@ type Props = BottomTabBarProps & {
|
|||||||
const DEFAULT_TABBAR_HEIGHT = 50;
|
const DEFAULT_TABBAR_HEIGHT = 50;
|
||||||
const DEFAULT_MAX_TAB_ITEM_WIDTH = 125;
|
const DEFAULT_MAX_TAB_ITEM_WIDTH = 125;
|
||||||
|
|
||||||
|
const useNativeDriver = Platform.OS !== 'web';
|
||||||
|
|
||||||
export default function BottomTabBar({
|
export default function BottomTabBar({
|
||||||
state,
|
state,
|
||||||
navigation,
|
navigation,
|
||||||
@@ -48,7 +50,10 @@ export default function BottomTabBar({
|
|||||||
const { colors } = useTheme();
|
const { colors } = useTheme();
|
||||||
|
|
||||||
const [dimensions, setDimensions] = React.useState(Dimensions.get('window'));
|
const [dimensions, setDimensions] = React.useState(Dimensions.get('window'));
|
||||||
const [layout, setLayout] = React.useState({ height: 0, width: 0 });
|
const [layout, setLayout] = React.useState({
|
||||||
|
height: 0,
|
||||||
|
width: dimensions.width,
|
||||||
|
});
|
||||||
const [keyboardShown, setKeyboardShown] = React.useState(false);
|
const [keyboardShown, setKeyboardShown] = React.useState(false);
|
||||||
|
|
||||||
const [visible] = React.useState(() => new Animated.Value(0));
|
const [visible] = React.useState(() => new Animated.Value(0));
|
||||||
@@ -60,7 +65,7 @@ export default function BottomTabBar({
|
|||||||
Animated.timing(visible, {
|
Animated.timing(visible, {
|
||||||
toValue: 0,
|
toValue: 0,
|
||||||
duration: 200,
|
duration: 200,
|
||||||
useNativeDriver: true,
|
useNativeDriver,
|
||||||
}).start();
|
}).start();
|
||||||
}
|
}
|
||||||
}, [keyboardShown, visible]);
|
}, [keyboardShown, visible]);
|
||||||
@@ -76,7 +81,7 @@ export default function BottomTabBar({
|
|||||||
Animated.timing(visible, {
|
Animated.timing(visible, {
|
||||||
toValue: 1,
|
toValue: 1,
|
||||||
duration: 250,
|
duration: 250,
|
||||||
useNativeDriver: true,
|
useNativeDriver,
|
||||||
}).start(({ finished }) => {
|
}).start(({ finished }) => {
|
||||||
if (finished) {
|
if (finished) {
|
||||||
setKeyboardShown(false);
|
setKeyboardShown(false);
|
||||||
@@ -122,27 +127,15 @@ export default function BottomTabBar({
|
|||||||
};
|
};
|
||||||
|
|
||||||
const shouldUseHorizontalLabels = () => {
|
const shouldUseHorizontalLabels = () => {
|
||||||
const isLandscape = dimensions.width > dimensions.height;
|
|
||||||
|
|
||||||
if (labelPosition) {
|
if (labelPosition) {
|
||||||
let position;
|
return labelPosition === 'beside-icon';
|
||||||
|
|
||||||
if (typeof labelPosition === 'string') {
|
|
||||||
position = labelPosition;
|
|
||||||
} else {
|
|
||||||
position = labelPosition({ dimensions });
|
|
||||||
}
|
|
||||||
|
|
||||||
if (position) {
|
|
||||||
return position === 'beside-icon';
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!adaptive) {
|
if (!adaptive) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (dimensions.width >= 768) {
|
if (layout.width >= 768) {
|
||||||
// Screen size matches a tablet
|
// Screen size matches a tablet
|
||||||
let maxTabItemWidth = DEFAULT_MAX_TAB_ITEM_WIDTH;
|
let maxTabItemWidth = DEFAULT_MAX_TAB_ITEM_WIDTH;
|
||||||
|
|
||||||
@@ -156,8 +149,10 @@ export default function BottomTabBar({
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return routes.length * maxTabItemWidth <= dimensions.width;
|
return routes.length * maxTabItemWidth <= layout.width;
|
||||||
} else {
|
} else {
|
||||||
|
const isLandscape = dimensions.width > dimensions.height;
|
||||||
|
|
||||||
return isLandscape;
|
return isLandscape;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@@ -205,6 +200,7 @@ export default function BottomTabBar({
|
|||||||
const event = navigation.emit({
|
const event = navigation.emit({
|
||||||
type: 'tabPress',
|
type: 'tabPress',
|
||||||
target: route.key,
|
target: route.key,
|
||||||
|
canPreventDefault: true,
|
||||||
});
|
});
|
||||||
|
|
||||||
if (!focused && !event.defaultPrevented) {
|
if (!focused && !event.defaultPrevented) {
|
||||||
|
|||||||
@@ -92,7 +92,7 @@ export default class BottomTabView extends React.Component<Props, State> {
|
|||||||
};
|
};
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
const { state, descriptors, lazy, unmountInactiveScreens } = this.props;
|
const { state, descriptors, lazy } = this.props;
|
||||||
const { routes } = state;
|
const { routes } = state;
|
||||||
const { loaded } = this.state;
|
const { loaded } = this.state;
|
||||||
|
|
||||||
@@ -101,17 +101,19 @@ export default class BottomTabView extends React.Component<Props, State> {
|
|||||||
<View style={styles.container}>
|
<View style={styles.container}>
|
||||||
<ScreenContainer style={styles.pages}>
|
<ScreenContainer style={styles.pages}>
|
||||||
{routes.map((route, index) => {
|
{routes.map((route, index) => {
|
||||||
if (unmountInactiveScreens && index !== state.index) {
|
const descriptor = descriptors[route.key];
|
||||||
|
const { unmountOnBlur } = descriptor.options;
|
||||||
|
const isFocused = state.index === index;
|
||||||
|
|
||||||
|
if (unmountOnBlur && !isFocused) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (lazy && !loaded.includes(index)) {
|
if (lazy && !loaded.includes(index) && !isFocused) {
|
||||||
// Don't render a screen if we've never navigated to it
|
// Don't render a screen if we've never navigated to it
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
const isFocused = state.index === index;
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<ResourceSavingScene
|
<ResourceSavingScene
|
||||||
key={route.key}
|
key={route.key}
|
||||||
@@ -119,7 +121,7 @@ export default class BottomTabView extends React.Component<Props, State> {
|
|||||||
isVisible={isFocused}
|
isVisible={isFocused}
|
||||||
>
|
>
|
||||||
<SceneContent isFocused={isFocused}>
|
<SceneContent isFocused={isFocused}>
|
||||||
{descriptors[route.key].render()}
|
{descriptor.render()}
|
||||||
</SceneContent>
|
</SceneContent>
|
||||||
</ResourceSavingScene>
|
</ResourceSavingScene>
|
||||||
);
|
);
|
||||||
|
|||||||
6
packages/bottom-tabs/tsconfig.build.json
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"extends": "./tsconfig",
|
||||||
|
"compilerOptions": {
|
||||||
|
"paths": {}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,3 +1,11 @@
|
|||||||
{
|
{
|
||||||
"extends": "../../tsconfig"
|
"extends": "../../tsconfig",
|
||||||
|
"references": [
|
||||||
|
{ "path": "../core" },
|
||||||
|
{ "path": "../native" },
|
||||||
|
{ "path": "../routers" }
|
||||||
|
],
|
||||||
|
"compilerOptions": {
|
||||||
|
"outDir": "./lib/typescript"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,6 +3,93 @@
|
|||||||
All notable changes to this project will be documented in this file.
|
All notable changes to this project will be documented in this file.
|
||||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||||
|
|
||||||
|
# [5.0.0-alpha.33](https://github.com/react-navigation/navigation-ex/tree/master/packages/compat/compare/@react-navigation/compat@5.0.0-alpha.32...@react-navigation/compat@5.0.0-alpha.33) (2020-02-04)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @react-navigation/compat
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# [5.0.0-alpha.32](https://github.com/react-navigation/navigation-ex/tree/master/packages/compat/compare/@react-navigation/compat@5.0.0-alpha.31...@react-navigation/compat@5.0.0-alpha.32) (2020-02-03)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @react-navigation/compat
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# [5.0.0-alpha.31](https://github.com/react-navigation/navigation-ex/tree/master/packages/compat/compare/@react-navigation/compat@5.0.0-alpha.28...@react-navigation/compat@5.0.0-alpha.31) (2020-02-02)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* add licenses ([0c159db](https://github.com/react-navigation/navigation-ex/tree/master/packages/compat/commit/0c159db4c9bc85e83b5cfe6819ab2562669a4d8f))
|
||||||
|
* throw when assigning or accessing the router property in compat ([944fa35](https://github.com/react-navigation/navigation-ex/tree/master/packages/compat/commit/944fa35ed4778ebc7fa7cd50092719cbd5bf3caf))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# [5.0.0-alpha.29](https://github.com/react-navigation/navigation-ex/tree/master/packages/compat/compare/@react-navigation/compat@5.0.0-alpha.28...@react-navigation/compat@5.0.0-alpha.29) (2020-02-02)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* add licenses ([0c159db](https://github.com/react-navigation/navigation-ex/tree/master/packages/compat/commit/0c159db4c9bc85e83b5cfe6819ab2562669a4d8f))
|
||||||
|
* throw when assigning or accessing the router property in compat ([944fa35](https://github.com/react-navigation/navigation-ex/tree/master/packages/compat/commit/944fa35ed4778ebc7fa7cd50092719cbd5bf3caf))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# [5.0.0-alpha.28](https://github.com/react-navigation/navigation-ex/tree/master/packages/compat/compare/@react-navigation/compat@5.0.0-alpha.27...@react-navigation/compat@5.0.0-alpha.28) (2020-01-24)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @react-navigation/compat
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# [5.0.0-alpha.27](https://github.com/react-navigation/navigation-ex/tree/master/packages/compat/compare/@react-navigation/compat@5.0.0-alpha.26...@react-navigation/compat@5.0.0-alpha.27) (2020-01-23)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* ensure re-render on isFirstRouteInParent change in compat layer ([14ae373](https://github.com/react-navigation/navigation-ex/tree/master/packages/compat/commit/14ae3738cf46088e082bd1c60b9dcc6dacacd1bf))
|
||||||
|
* improvements to the compat layer ([2a76dc4](https://github.com/react-navigation/navigation-ex/tree/master/packages/compat/commit/2a76dc4d3c4cc0365a3afcff6ac321145efed026))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# [5.0.0-alpha.26](https://github.com/react-navigation/navigation-ex/tree/master/packages/compat/compare/@react-navigation/compat@5.0.0-alpha.25...@react-navigation/compat@5.0.0-alpha.26) (2020-01-14)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @react-navigation/compat
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# [5.0.0-alpha.25](https://github.com/react-navigation/navigation-ex/tree/master/packages/compat/compare/@react-navigation/compat@5.0.0-alpha.24...@react-navigation/compat@5.0.0-alpha.25) (2020-01-13)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* make sure paths aren't aliased when building definitions ([65a5dac](https://github.com/react-navigation/navigation-ex/tree/master/packages/compat/commit/65a5dac2bf887f4ba081ab15bd4c9870bb15697f)), closes [#265](https://github.com/react-navigation/navigation-ex/tree/master/packages/compat/issues/265)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# [5.0.0-alpha.24](https://github.com/react-navigation/navigation-ex/tree/master/packages/compat/compare/@react-navigation/compat@5.0.0-alpha.23...@react-navigation/compat@5.0.0-alpha.24) (2020-01-13)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @react-navigation/compat
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# [5.0.0-alpha.23](https://github.com/react-navigation/navigation-ex/tree/master/packages/compat/compare/@react-navigation/compat@5.0.0-alpha.21...@react-navigation/compat@5.0.0-alpha.23) (2020-01-09)
|
# [5.0.0-alpha.23](https://github.com/react-navigation/navigation-ex/tree/master/packages/compat/compare/@react-navigation/compat@5.0.0-alpha.21...@react-navigation/compat@5.0.0-alpha.23) (2020-01-09)
|
||||||
|
|
||||||
**Note:** Version bump only for package @react-navigation/compat
|
**Note:** Version bump only for package @react-navigation/compat
|
||||||
|
|||||||
21
packages/compat/LICENSE
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
MIT License
|
||||||
|
|
||||||
|
Copyright (c) 2017 React Navigation Contributors
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
@@ -1,17 +1,18 @@
|
|||||||
{
|
{
|
||||||
"name": "@react-navigation/compat",
|
"name": "@react-navigation/compat",
|
||||||
"description": "Compatibility layer to write navigator definitions in static configuration format",
|
"description": "Compatibility layer to write navigator definitions in static configuration format",
|
||||||
"version": "5.0.0-alpha.23",
|
"version": "5.0.0-alpha.33",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"repository": "https://github.com/react-navigation/navigation-ex/tree/master/packages/compat",
|
"repository": "https://github.com/react-navigation/navigation-ex/tree/master/packages/compat",
|
||||||
"main": "lib/commonjs/index.js",
|
"main": "lib/commonjs/index.js",
|
||||||
"react-native": "src/index.tsx",
|
"react-native": "src/index.tsx",
|
||||||
"module": "lib/module/index.js",
|
"module": "lib/module/index.js",
|
||||||
"types": "lib/typescript/compat/src/index.d.ts",
|
"types": "lib/typescript/src/index.d.ts",
|
||||||
"files": [
|
"files": [
|
||||||
"src",
|
"src",
|
||||||
"lib"
|
"lib"
|
||||||
],
|
],
|
||||||
|
"sideEffects": false,
|
||||||
"publishConfig": {
|
"publishConfig": {
|
||||||
"access": "public"
|
"access": "public"
|
||||||
},
|
},
|
||||||
@@ -20,7 +21,7 @@
|
|||||||
"clean": "del lib"
|
"clean": "del lib"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@react-navigation/routers": "^5.0.0-alpha.22"
|
"@react-navigation/routers": "^5.0.0-alpha.32"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@types/react": "^16.9.17",
|
"@types/react": "^16.9.17",
|
||||||
@@ -37,7 +38,12 @@
|
|||||||
"targets": [
|
"targets": [
|
||||||
"commonjs",
|
"commonjs",
|
||||||
"module",
|
"module",
|
||||||
"typescript"
|
[
|
||||||
|
"typescript",
|
||||||
|
{
|
||||||
|
"project": "tsconfig.build.json"
|
||||||
|
}
|
||||||
|
]
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import {
|
|||||||
RouteProp,
|
RouteProp,
|
||||||
} from '@react-navigation/native';
|
} from '@react-navigation/native';
|
||||||
import ScreenPropsContext from './ScreenPropsContext';
|
import ScreenPropsContext from './ScreenPropsContext';
|
||||||
import createCompatNavigationProp from './createCompatNavigationProp';
|
import useCompatNavigation from './useCompatNavigation';
|
||||||
|
|
||||||
type Props<ParamList extends ParamListBase> = {
|
type Props<ParamList extends ParamListBase> = {
|
||||||
navigation: NavigationProp<ParamList>;
|
navigation: NavigationProp<ParamList>;
|
||||||
@@ -16,12 +16,7 @@ type Props<ParamList extends ParamListBase> = {
|
|||||||
function ScreenComponent<ParamList extends ParamListBase>(
|
function ScreenComponent<ParamList extends ParamListBase>(
|
||||||
props: Props<ParamList>
|
props: Props<ParamList>
|
||||||
) {
|
) {
|
||||||
const navigation = React.useMemo(
|
const navigation = useCompatNavigation();
|
||||||
() =>
|
|
||||||
createCompatNavigationProp(props.navigation as any, props.route as any),
|
|
||||||
[props.navigation, props.route]
|
|
||||||
);
|
|
||||||
|
|
||||||
const screenProps = React.useContext(ScreenPropsContext);
|
const screenProps = React.useContext(ScreenPropsContext);
|
||||||
|
|
||||||
return <props.component navigation={navigation} screenProps={screenProps} />;
|
return <props.component navigation={navigation} screenProps={screenProps} />;
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ export function replace({
|
|||||||
key?: string;
|
key?: string;
|
||||||
newKey?: string;
|
newKey?: string;
|
||||||
action?: never;
|
action?: never;
|
||||||
}): CommonActions.Action {
|
}): StackActionType {
|
||||||
if (action !== undefined) {
|
if (action !== undefined) {
|
||||||
throw new Error(
|
throw new Error(
|
||||||
'Sub-actions are not supported for `replace`. Remove the `action` key from the options.'
|
'Sub-actions are not supported for `replace`. Remove the `action` key from the options.'
|
||||||
|
|||||||
@@ -8,11 +8,17 @@ import {
|
|||||||
import * as helpers from './helpers';
|
import * as helpers from './helpers';
|
||||||
import { CompatNavigationProp } from './types';
|
import { CompatNavigationProp } from './types';
|
||||||
|
|
||||||
type EventName = 'willFocus' | 'willBlur' | 'didFocus' | 'didBlur' | 'refocus';
|
type EventName =
|
||||||
|
| 'action'
|
||||||
|
| 'willFocus'
|
||||||
|
| 'willBlur'
|
||||||
|
| 'didFocus'
|
||||||
|
| 'didBlur'
|
||||||
|
| 'refocus';
|
||||||
|
|
||||||
const focusSubscriptions = new WeakMap<() => void, () => void>();
|
// const focusSubscriptions = new WeakMap<() => void, () => void>();
|
||||||
const blurSubscriptions = new WeakMap<() => void, () => void>();
|
// const blurSubscriptions = new WeakMap<() => void, () => void>();
|
||||||
const refocusSubscriptions = new WeakMap<() => void, () => void>();
|
// const refocusSubscriptions = new WeakMap<() => void, () => void>();
|
||||||
|
|
||||||
export default function createCompatNavigationProp<
|
export default function createCompatNavigationProp<
|
||||||
NavigationPropType extends NavigationProp<ParamListBase>,
|
NavigationPropType extends NavigationProp<ParamListBase>,
|
||||||
@@ -28,8 +34,17 @@ export default function createCompatNavigationProp<
|
|||||||
state?: NavigationState | PartialState<NavigationState>;
|
state?: NavigationState | PartialState<NavigationState>;
|
||||||
})
|
})
|
||||||
| NavigationState
|
| NavigationState
|
||||||
| PartialState<NavigationState>
|
| PartialState<NavigationState>,
|
||||||
|
context: Record<string, any>,
|
||||||
|
isFirstRouteInParent?: boolean
|
||||||
): CompatNavigationProp<NavigationPropType> {
|
): CompatNavigationProp<NavigationPropType> {
|
||||||
|
context.parent = context.parent || {};
|
||||||
|
context.subscriptions = context.subscriptions || {
|
||||||
|
didFocus: new Map<() => void, () => void>(),
|
||||||
|
didBlur: new Map<() => void, () => void>(),
|
||||||
|
refocus: new Map<() => void, () => void>(),
|
||||||
|
};
|
||||||
|
|
||||||
return {
|
return {
|
||||||
...navigation,
|
...navigation,
|
||||||
...Object.entries(helpers).reduce<{
|
...Object.entries(helpers).reduce<{
|
||||||
@@ -61,7 +76,7 @@ export default function createCompatNavigationProp<
|
|||||||
|
|
||||||
// @ts-ignore
|
// @ts-ignore
|
||||||
unsubscribe = navigation.addListener('transitionEnd', listener);
|
unsubscribe = navigation.addListener('transitionEnd', listener);
|
||||||
focusSubscriptions.set(callback, unsubscribe);
|
context.subscriptions.didFocus.set(callback, unsubscribe);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 'didBlur': {
|
case 'didBlur': {
|
||||||
@@ -73,7 +88,7 @@ export default function createCompatNavigationProp<
|
|||||||
|
|
||||||
// @ts-ignore
|
// @ts-ignore
|
||||||
unsubscribe = navigation.addListener('transitionEnd', listener);
|
unsubscribe = navigation.addListener('transitionEnd', listener);
|
||||||
blurSubscriptions.set(callback, unsubscribe);
|
context.subscriptions.didBlur.set(callback, unsubscribe);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 'refocus': {
|
case 'refocus': {
|
||||||
@@ -85,9 +100,11 @@ export default function createCompatNavigationProp<
|
|||||||
|
|
||||||
// @ts-ignore
|
// @ts-ignore
|
||||||
unsubscribe = navigation.addListener('tabPress', listener);
|
unsubscribe = navigation.addListener('tabPress', listener);
|
||||||
refocusSubscriptions.set(callback, unsubscribe);
|
context.subscriptions.refocus.set(callback, unsubscribe);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case 'action':
|
||||||
|
throw new Error("Listening to 'action' events is not supported.");
|
||||||
default:
|
default:
|
||||||
// @ts-ignore
|
// @ts-ignore
|
||||||
unsubscribe = navigation.addListener(type, callback);
|
unsubscribe = navigation.addListener(type, callback);
|
||||||
@@ -100,6 +117,8 @@ export default function createCompatNavigationProp<
|
|||||||
return subscription;
|
return subscription;
|
||||||
},
|
},
|
||||||
removeListener(type: EventName, callback: () => void) {
|
removeListener(type: EventName, callback: () => void) {
|
||||||
|
context.subscriptions = context.subscriptions || {};
|
||||||
|
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case 'willFocus':
|
case 'willFocus':
|
||||||
navigation.removeListener('focus', callback);
|
navigation.removeListener('focus', callback);
|
||||||
@@ -108,20 +127,22 @@ export default function createCompatNavigationProp<
|
|||||||
navigation.removeListener('blur', callback);
|
navigation.removeListener('blur', callback);
|
||||||
break;
|
break;
|
||||||
case 'didFocus': {
|
case 'didFocus': {
|
||||||
const unsubscribe = focusSubscriptions.get(callback);
|
const unsubscribe = context.subscriptions.didFocus.get(callback);
|
||||||
unsubscribe?.();
|
unsubscribe?.();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 'didBlur': {
|
case 'didBlur': {
|
||||||
const unsubscribe = blurSubscriptions.get(callback);
|
const unsubscribe = context.subscriptions.didBlur.get(callback);
|
||||||
unsubscribe?.();
|
unsubscribe?.();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 'refocus': {
|
case 'refocus': {
|
||||||
const unsubscribe = refocusSubscriptions.get(callback);
|
const unsubscribe = context.subscriptions.refocus.get(callback);
|
||||||
unsubscribe?.();
|
unsubscribe?.();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case 'action':
|
||||||
|
throw new Error("Listening to 'action' events is not supported.");
|
||||||
default:
|
default:
|
||||||
// @ts-ignore
|
// @ts-ignore
|
||||||
navigation.removeListener(type, callback);
|
navigation.removeListener(type, callback);
|
||||||
@@ -174,6 +195,10 @@ export default function createCompatNavigationProp<
|
|||||||
return defaultValue;
|
return defaultValue;
|
||||||
},
|
},
|
||||||
isFirstRouteInParent(): boolean {
|
isFirstRouteInParent(): boolean {
|
||||||
|
if (typeof isFirstRouteInParent === 'boolean') {
|
||||||
|
return isFirstRouteInParent;
|
||||||
|
}
|
||||||
|
|
||||||
const { routes } = navigation.dangerouslyGetState();
|
const { routes } = navigation.dangerouslyGetState();
|
||||||
|
|
||||||
// @ts-ignore
|
// @ts-ignore
|
||||||
@@ -185,7 +210,8 @@ export default function createCompatNavigationProp<
|
|||||||
if (parent) {
|
if (parent) {
|
||||||
return createCompatNavigationProp(
|
return createCompatNavigationProp(
|
||||||
parent,
|
parent,
|
||||||
navigation.dangerouslyGetState()
|
navigation.dangerouslyGetState(),
|
||||||
|
context.parent
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -110,7 +110,7 @@ export default function createCompatNavigatorFactory<
|
|||||||
? {
|
? {
|
||||||
navigation: createCompatNavigationProp<
|
navigation: createCompatNavigationProp<
|
||||||
NavigationPropType
|
NavigationPropType
|
||||||
>(navigation, route),
|
>(navigation, route, {}),
|
||||||
navigationOptions: defaultNavigationOptions || {},
|
navigationOptions: defaultNavigationOptions || {},
|
||||||
screenProps,
|
screenProps,
|
||||||
}
|
}
|
||||||
@@ -165,7 +165,25 @@ export default function createCompatNavigatorFactory<
|
|||||||
return Navigator;
|
return Navigator;
|
||||||
};
|
};
|
||||||
|
|
||||||
createCompatNavigator.isCompat = true;
|
Object.defineProperties(createCompatNavigator, {
|
||||||
|
isCompat: {
|
||||||
|
get() {
|
||||||
|
return true;
|
||||||
|
},
|
||||||
|
},
|
||||||
|
router: {
|
||||||
|
get() {
|
||||||
|
throw new Error(
|
||||||
|
"It's no longer possible to access the router with the 'router' property."
|
||||||
|
);
|
||||||
|
},
|
||||||
|
set() {
|
||||||
|
throw new Error(
|
||||||
|
"It's no longer possible to override the router by assigning the 'router' property."
|
||||||
|
);
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
return createCompatNavigator;
|
return createCompatNavigator;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import {
|
|||||||
useRoute,
|
useRoute,
|
||||||
NavigationProp,
|
NavigationProp,
|
||||||
ParamListBase,
|
ParamListBase,
|
||||||
|
useNavigationState,
|
||||||
} from '@react-navigation/native';
|
} from '@react-navigation/native';
|
||||||
import createCompatNavigationProp from './createCompatNavigationProp';
|
import createCompatNavigationProp from './createCompatNavigationProp';
|
||||||
import { CompatNavigationProp } from './types';
|
import { CompatNavigationProp } from './types';
|
||||||
@@ -14,12 +15,20 @@ export default function useCompatNavigation<
|
|||||||
const navigation = useNavigation();
|
const navigation = useNavigation();
|
||||||
const route = useRoute();
|
const route = useRoute();
|
||||||
|
|
||||||
|
const isFirstRouteInParent = useNavigationState(
|
||||||
|
state => state.routes[0].key === route.key
|
||||||
|
);
|
||||||
|
|
||||||
|
const context = React.useRef<Record<string, any>>({});
|
||||||
|
|
||||||
return React.useMemo(
|
return React.useMemo(
|
||||||
() =>
|
() =>
|
||||||
createCompatNavigationProp(
|
createCompatNavigationProp(
|
||||||
navigation,
|
navigation,
|
||||||
route as any
|
route as any,
|
||||||
|
context.current,
|
||||||
|
isFirstRouteInParent
|
||||||
) as CompatNavigationProp<T>,
|
) as CompatNavigationProp<T>,
|
||||||
[navigation, route]
|
[isFirstRouteInParent, navigation, route]
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
6
packages/compat/tsconfig.build.json
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"extends": "./tsconfig",
|
||||||
|
"compilerOptions": {
|
||||||
|
"paths": {}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,3 +1,11 @@
|
|||||||
{
|
{
|
||||||
"extends": "../../tsconfig"
|
"extends": "../../tsconfig",
|
||||||
|
"references": [
|
||||||
|
{ "path": "../core" },
|
||||||
|
{ "path": "../native" },
|
||||||
|
{ "path": "../routers" }
|
||||||
|
],
|
||||||
|
"compilerOptions": {
|
||||||
|
"outDir": "./lib/typescript"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,6 +3,130 @@
|
|||||||
All notable changes to this project will be documented in this file.
|
All notable changes to this project will be documented in this file.
|
||||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||||
|
|
||||||
|
# [5.0.0-alpha.42](https://github.com/react-navigation/navigation-ex/tree/master/packages/core/compare/@react-navigation/core@5.0.0-alpha.41...@react-navigation/core@5.0.0-alpha.42) (2020-02-04)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @react-navigation/core
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# [5.0.0-alpha.41](https://github.com/react-navigation/navigation-ex/tree/master/packages/core/compare/@react-navigation/core@5.0.0-alpha.40...@react-navigation/core@5.0.0-alpha.41) (2020-02-03)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* ignore circular references when checking serializable ([e5063b9](https://github.com/react-navigation/navigation-ex/tree/master/packages/core/commit/e5063b93398350511f3fd2ef48425559f871781f))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# [5.0.0-alpha.40](https://github.com/react-navigation/navigation-ex/tree/master/packages/core/compare/@react-navigation/core@5.0.0-alpha.37...@react-navigation/core@5.0.0-alpha.40) (2020-02-02)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* add licenses ([0c159db](https://github.com/react-navigation/navigation-ex/tree/master/packages/core/commit/0c159db4c9bc85e83b5cfe6819ab2562669a4d8f))
|
||||||
|
* add warning when passing inline function to component prop ([fa4a959](https://github.com/react-navigation/navigation-ex/tree/master/packages/core/commit/fa4a959549ccd9dc2f9bd2ea495e99abdedc9f94))
|
||||||
|
* tweak error messages for validation ([2243b45](https://github.com/react-navigation/navigation-ex/tree/master/packages/core/commit/2243b45cc1addf83727166d82736d214f181b1fb))
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* add `screens` prop for nested configs ([#308](https://github.com/react-navigation/navigation-ex/tree/master/packages/core/issues/308)) ([b931ae6](https://github.com/react-navigation/navigation-ex/tree/master/packages/core/commit/b931ae62dfb2c5253c94ea5ace73e9070ec17c4a))
|
||||||
|
* add useIsDrawerOpen hook ([#299](https://github.com/react-navigation/navigation-ex/tree/master/packages/core/issues/299)) ([ecd68af](https://github.com/react-navigation/navigation-ex/tree/master/packages/core/commit/ecd68afb46a4c56200748da5e5fb284fa5a839db))
|
||||||
|
* integrate with history API on web ([5a3f835](https://github.com/react-navigation/navigation-ex/tree/master/packages/core/commit/5a3f8356b05bff7ed20893a5db6804612da3e568))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# [5.0.0-alpha.38](https://github.com/react-navigation/navigation-ex/tree/master/packages/core/compare/@react-navigation/core@5.0.0-alpha.37...@react-navigation/core@5.0.0-alpha.38) (2020-02-02)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* add licenses ([0c159db](https://github.com/react-navigation/navigation-ex/tree/master/packages/core/commit/0c159db4c9bc85e83b5cfe6819ab2562669a4d8f))
|
||||||
|
* add warning when passing inline function to component prop ([fa4a959](https://github.com/react-navigation/navigation-ex/tree/master/packages/core/commit/fa4a959549ccd9dc2f9bd2ea495e99abdedc9f94))
|
||||||
|
* tweak error messages for validation ([2243b45](https://github.com/react-navigation/navigation-ex/tree/master/packages/core/commit/2243b45cc1addf83727166d82736d214f181b1fb))
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* add `screens` prop for nested configs ([#308](https://github.com/react-navigation/navigation-ex/tree/master/packages/core/issues/308)) ([b931ae6](https://github.com/react-navigation/navigation-ex/tree/master/packages/core/commit/b931ae62dfb2c5253c94ea5ace73e9070ec17c4a))
|
||||||
|
* add useIsDrawerOpen hook ([#299](https://github.com/react-navigation/navigation-ex/tree/master/packages/core/issues/299)) ([ecd68af](https://github.com/react-navigation/navigation-ex/tree/master/packages/core/commit/ecd68afb46a4c56200748da5e5fb284fa5a839db))
|
||||||
|
* integrate with history API on web ([5a3f835](https://github.com/react-navigation/navigation-ex/tree/master/packages/core/commit/5a3f8356b05bff7ed20893a5db6804612da3e568))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# [5.0.0-alpha.37](https://github.com/react-navigation/navigation-ex/tree/master/packages/core/compare/@react-navigation/core@5.0.0-alpha.36...@react-navigation/core@5.0.0-alpha.37) (2020-01-24)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* add error message when trying to use v4 API with v5 ([179e807](https://github.com/react-navigation/navigation-ex/tree/master/packages/core/commit/179e807a64a7d031d671c2c4b12edaee3c3440c5))
|
||||||
|
* validate screen configs ([2f1f0af](https://github.com/react-navigation/navigation-ex/tree/master/packages/core/commit/2f1f0af862ef8625da4c2aaf463d45fe17a4ac88))
|
||||||
|
* warn if non-serializable values found in state ([5751e7f](https://github.com/react-navigation/navigation-ex/tree/master/packages/core/commit/5751e7f97a1731a5c71862174dfd931b6ffe13e2))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# [5.0.0-alpha.36](https://github.com/react-navigation/navigation-ex/tree/master/packages/core/compare/@react-navigation/core@5.0.0-alpha.35...@react-navigation/core@5.0.0-alpha.36) (2020-01-23)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* disallow canPreventDefault option if not present in types ([d9059b5](https://github.com/react-navigation/navigation-ex/tree/master/packages/core/commit/d9059b56d8a89b39fec43d38a7b0514d41c0b550))
|
||||||
|
* don't add ?if query params is empty ([3bf5ddd](https://github.com/react-navigation/navigation-ex/tree/master/packages/core/commit/3bf5ddde2ac1ba45f1123752d37532175f18a3d9))
|
||||||
|
* fix types for useFocusEffect ([23ab45a](https://github.com/react-navigation/navigation-ex/tree/master/packages/core/commit/23ab45aceb72cc27ebfacdedfbf60d0c540fecfb)), closes [#270](https://github.com/react-navigation/navigation-ex/tree/master/packages/core/issues/270)
|
||||||
|
* make sure that we return correct value if selector changes ([6c2acbb](https://github.com/react-navigation/navigation-ex/tree/master/packages/core/commit/6c2acbb304a9f11789b45a410b6c41911eca3947)), closes [/github.com/react-navigation/navigation-ex/pull/273#issuecomment-576581225](https://github.com/react-navigation/navigation-ex/tree/master/packages/core/issues/issuecomment-576581225)
|
||||||
|
* use protected for private value store ([ad4eaff](https://github.com/react-navigation/navigation-ex/tree/master/packages/core/commit/ad4eaff1e99e4f9fca3a193764fd0f26efa41341))
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* add useNavigationState hook ([32a2206](https://github.com/react-navigation/navigation-ex/tree/master/packages/core/commit/32a2206513bc084d8da07187385d11db498f1e2a))
|
||||||
|
* let the navigator specify if default can be prevented ([da67e13](https://github.com/react-navigation/navigation-ex/tree/master/packages/core/commit/da67e134d2157201360427d3c10da24f24cae7aa))
|
||||||
|
* support nested config in getPathFromState ([#266](https://github.com/react-navigation/navigation-ex/tree/master/packages/core/issues/266)) ([1e53821](https://github.com/react-navigation/navigation-ex/tree/master/packages/core/commit/1e53821d52be182369add07a86c72221c5dba53e))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# [5.0.0-alpha.35](https://github.com/react-navigation/navigation-ex/tree/master/packages/core/compare/@react-navigation/core@5.0.0-alpha.34...@react-navigation/core@5.0.0-alpha.35) (2020-01-14)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* fix intellisense for CompositeNavigationProp ([a912323](https://github.com/react-navigation/navigation-ex/tree/master/packages/core/commit/a912323c1dfa0c3564ca82c448a86f85d1658f7f))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# [5.0.0-alpha.34](https://github.com/react-navigation/navigation-ex/tree/master/packages/core/compare/@react-navigation/core@5.0.0-alpha.33...@react-navigation/core@5.0.0-alpha.34) (2020-01-13)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* make sure paths aren't aliased when building definitions ([65a5dac](https://github.com/react-navigation/navigation-ex/tree/master/packages/core/commit/65a5dac2bf887f4ba081ab15bd4c9870bb15697f)), closes [#265](https://github.com/react-navigation/navigation-ex/tree/master/packages/core/issues/265)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# [5.0.0-alpha.33](https://github.com/react-navigation/navigation-ex/tree/master/packages/core/compare/@react-navigation/core@5.0.0-alpha.32...@react-navigation/core@5.0.0-alpha.33) (2020-01-13)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @react-navigation/core
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# [5.0.0-alpha.32](https://github.com/react-navigation/navigation-ex/tree/master/packages/core/compare/@react-navigation/core@5.0.0-alpha.30...@react-navigation/core@5.0.0-alpha.32) (2020-01-09)
|
# [5.0.0-alpha.32](https://github.com/react-navigation/navigation-ex/tree/master/packages/core/compare/@react-navigation/core@5.0.0-alpha.30...@react-navigation/core@5.0.0-alpha.32) (2020-01-09)
|
||||||
|
|
||||||
**Note:** Version bump only for package @react-navigation/core
|
**Note:** Version bump only for package @react-navigation/core
|
||||||
|
|||||||
21
packages/core/LICENSE
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
MIT License
|
||||||
|
|
||||||
|
Copyright (c) 2017 React Navigation Contributors
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
@@ -6,13 +6,13 @@
|
|||||||
"react-native",
|
"react-native",
|
||||||
"react-navigation"
|
"react-navigation"
|
||||||
],
|
],
|
||||||
"version": "5.0.0-alpha.32",
|
"version": "5.0.0-alpha.42",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"repository": "https://github.com/react-navigation/navigation-ex/tree/master/packages/core",
|
"repository": "https://github.com/react-navigation/navigation-ex/tree/master/packages/core",
|
||||||
"main": "lib/commonjs/index.js",
|
"main": "lib/commonjs/index.js",
|
||||||
"react-native": "src/index.tsx",
|
"react-native": "src/index.tsx",
|
||||||
"module": "lib/module/index.js",
|
"module": "lib/module/index.js",
|
||||||
"types": "lib/typescript/index.d.ts",
|
"types": "lib/typescript/src/index.d.ts",
|
||||||
"files": [
|
"files": [
|
||||||
"src",
|
"src",
|
||||||
"lib"
|
"lib"
|
||||||
@@ -27,14 +27,17 @@
|
|||||||
"dependencies": {
|
"dependencies": {
|
||||||
"escape-string-regexp": "^2.0.0",
|
"escape-string-regexp": "^2.0.0",
|
||||||
"query-string": "^6.9.0",
|
"query-string": "^6.9.0",
|
||||||
|
"react-is": "^16.12.0",
|
||||||
"shortid": "^2.2.15",
|
"shortid": "^2.2.15",
|
||||||
"use-subscription": "^1.3.0"
|
"use-subscription": "^1.3.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@babel/core": "^7.7.7",
|
"@babel/core": "^7.7.7",
|
||||||
"@react-native-community/bob": "^0.7.0",
|
"@react-native-community/bob": "^0.8.0",
|
||||||
"@types/react": "^16.9.17",
|
"@types/react": "^16.9.17",
|
||||||
|
"@types/react-is": "^16.7.1",
|
||||||
"@types/shortid": "^0.0.29",
|
"@types/shortid": "^0.0.29",
|
||||||
|
"@types/use-subscription": "^1.0.0",
|
||||||
"del-cli": "^3.0.0",
|
"del-cli": "^3.0.0",
|
||||||
"react": "~16.9.0",
|
"react": "~16.9.0",
|
||||||
"react-native-testing-library": "^1.12.0",
|
"react-native-testing-library": "^1.12.0",
|
||||||
@@ -50,7 +53,12 @@
|
|||||||
"targets": [
|
"targets": [
|
||||||
"commonjs",
|
"commonjs",
|
||||||
"module",
|
"module",
|
||||||
"typescript"
|
[
|
||||||
|
"typescript",
|
||||||
|
{
|
||||||
|
"project": "tsconfig.build.json"
|
||||||
|
}
|
||||||
|
]
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
300
packages/core/src/BaseNavigationContainer.tsx
Normal file
@@ -0,0 +1,300 @@
|
|||||||
|
import * as React from 'react';
|
||||||
|
import * as CommonActions from './CommonActions';
|
||||||
|
import EnsureSingleNavigator from './EnsureSingleNavigator';
|
||||||
|
import NavigationBuilderContext from './NavigationBuilderContext';
|
||||||
|
import useFocusedListeners from './useFocusedListeners';
|
||||||
|
import useDevTools from './useDevTools';
|
||||||
|
import useStateGetters from './useStateGetters';
|
||||||
|
import isSerializable from './isSerializable';
|
||||||
|
|
||||||
|
import {
|
||||||
|
Route,
|
||||||
|
NavigationState,
|
||||||
|
InitialState,
|
||||||
|
PartialState,
|
||||||
|
NavigationAction,
|
||||||
|
NavigationContainerRef,
|
||||||
|
NavigationContainerProps,
|
||||||
|
} from './types';
|
||||||
|
import useEventEmitter from './useEventEmitter';
|
||||||
|
|
||||||
|
type State = NavigationState | PartialState<NavigationState> | undefined;
|
||||||
|
|
||||||
|
const MISSING_CONTEXT_ERROR =
|
||||||
|
"We couldn't find a navigation context. Have you wrapped your app with 'NavigationContainer'?";
|
||||||
|
|
||||||
|
export const NavigationStateContext = React.createContext<{
|
||||||
|
isDefault?: true;
|
||||||
|
state?: NavigationState | PartialState<NavigationState>;
|
||||||
|
getState: () => NavigationState | PartialState<NavigationState> | undefined;
|
||||||
|
setState: (
|
||||||
|
state: NavigationState | PartialState<NavigationState> | undefined
|
||||||
|
) => void;
|
||||||
|
key?: string;
|
||||||
|
performTransaction: (action: () => void) => void;
|
||||||
|
}>({
|
||||||
|
isDefault: true,
|
||||||
|
|
||||||
|
get getState(): any {
|
||||||
|
throw new Error(MISSING_CONTEXT_ERROR);
|
||||||
|
},
|
||||||
|
get setState(): any {
|
||||||
|
throw new Error(MISSING_CONTEXT_ERROR);
|
||||||
|
},
|
||||||
|
get performTransaction(): any {
|
||||||
|
throw new Error(MISSING_CONTEXT_ERROR);
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
let hasWarnedForSerialization = false;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remove `key` and `routeNames` from the state objects recursively to get partial state.
|
||||||
|
*
|
||||||
|
* @param state Initial state object.
|
||||||
|
*/
|
||||||
|
const getPartialState = (
|
||||||
|
state: InitialState | undefined
|
||||||
|
): PartialState<NavigationState> | undefined => {
|
||||||
|
if (state === undefined) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||||||
|
const { key, routeNames, ...partialState } = state;
|
||||||
|
|
||||||
|
// @ts-ignore
|
||||||
|
return {
|
||||||
|
...partialState,
|
||||||
|
stale: true,
|
||||||
|
routes: state.routes.map(route => {
|
||||||
|
if (route.state === undefined) {
|
||||||
|
return route as Route<string> & {
|
||||||
|
state?: PartialState<NavigationState>;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
return { ...route, state: getPartialState(route.state) };
|
||||||
|
}),
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Container component which holds the navigation state.
|
||||||
|
* This should be rendered at the root wrapping the whole app.
|
||||||
|
*
|
||||||
|
* @param props.initialState Initial state object for the navigation tree.
|
||||||
|
* @param props.onStateChange Callback which is called with the latest navigation state when it changes.
|
||||||
|
* @param props.children Child elements to render the content.
|
||||||
|
* @param props.ref Ref object which refers to the navigation object containing helper methods.
|
||||||
|
*/
|
||||||
|
const BaseNavigationContainer = React.forwardRef(
|
||||||
|
function BaseNavigationContainer(
|
||||||
|
{
|
||||||
|
initialState,
|
||||||
|
onStateChange,
|
||||||
|
independent,
|
||||||
|
children,
|
||||||
|
}: NavigationContainerProps,
|
||||||
|
ref: React.Ref<NavigationContainerRef>
|
||||||
|
) {
|
||||||
|
const parent = React.useContext(NavigationStateContext);
|
||||||
|
|
||||||
|
if (!parent.isDefault && !independent) {
|
||||||
|
throw new Error(
|
||||||
|
"Looks like you have nested a 'NavigationContainer' inside another. Normally you need only one container at the root of the app, so this was probably an error. If this was intentional, pass 'independent={true}' explicitely."
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
const [state, setNavigationState] = React.useState<State>(() =>
|
||||||
|
getPartialState(initialState == null ? undefined : initialState)
|
||||||
|
);
|
||||||
|
|
||||||
|
const navigationStateRef = React.useRef<State>();
|
||||||
|
const transactionStateRef = React.useRef<State | null>(null);
|
||||||
|
const isTransactionActiveRef = React.useRef<boolean>(false);
|
||||||
|
const isFirstMountRef = React.useRef<boolean>(true);
|
||||||
|
const skipTrackingRef = React.useRef<boolean>(false);
|
||||||
|
|
||||||
|
const performTransaction = React.useCallback((callback: () => void) => {
|
||||||
|
if (isTransactionActiveRef.current) {
|
||||||
|
throw new Error(
|
||||||
|
"Only one transaction can be active at a time. Did you accidentally nest 'performTransaction'?"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
setNavigationState((navigationState: State) => {
|
||||||
|
isTransactionActiveRef.current = true;
|
||||||
|
transactionStateRef.current = navigationState;
|
||||||
|
|
||||||
|
try {
|
||||||
|
callback();
|
||||||
|
} finally {
|
||||||
|
isTransactionActiveRef.current = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return transactionStateRef.current;
|
||||||
|
});
|
||||||
|
}, []);
|
||||||
|
|
||||||
|
const getState = React.useCallback(
|
||||||
|
() =>
|
||||||
|
transactionStateRef.current !== null
|
||||||
|
? transactionStateRef.current
|
||||||
|
: navigationStateRef.current,
|
||||||
|
[]
|
||||||
|
);
|
||||||
|
|
||||||
|
const setState = React.useCallback((navigationState: State) => {
|
||||||
|
if (transactionStateRef.current === null) {
|
||||||
|
throw new Error(
|
||||||
|
"Any 'setState' calls need to be done inside 'performTransaction'"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
transactionStateRef.current = navigationState;
|
||||||
|
}, []);
|
||||||
|
|
||||||
|
const reset = React.useCallback(
|
||||||
|
(state: NavigationState) => {
|
||||||
|
performTransaction(() => {
|
||||||
|
skipTrackingRef.current = true;
|
||||||
|
setState(state);
|
||||||
|
});
|
||||||
|
},
|
||||||
|
[performTransaction, setState]
|
||||||
|
);
|
||||||
|
|
||||||
|
const { trackState, trackAction } = useDevTools({
|
||||||
|
name: '@react-navigation',
|
||||||
|
reset,
|
||||||
|
state,
|
||||||
|
});
|
||||||
|
|
||||||
|
const {
|
||||||
|
listeners,
|
||||||
|
addListener: addFocusedListener,
|
||||||
|
} = useFocusedListeners();
|
||||||
|
|
||||||
|
const { getStateForRoute, addStateGetter } = useStateGetters();
|
||||||
|
|
||||||
|
const dispatch = (
|
||||||
|
action: NavigationAction | ((state: NavigationState) => NavigationAction)
|
||||||
|
) => {
|
||||||
|
listeners[0](navigation => navigation.dispatch(action));
|
||||||
|
};
|
||||||
|
|
||||||
|
const canGoBack = () => {
|
||||||
|
const { result, handled } = listeners[0](navigation =>
|
||||||
|
navigation.canGoBack()
|
||||||
|
);
|
||||||
|
|
||||||
|
if (handled) {
|
||||||
|
return result;
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const resetRoot = React.useCallback(
|
||||||
|
(state?: PartialState<NavigationState> | NavigationState) => {
|
||||||
|
performTransaction(() => {
|
||||||
|
trackAction('@@RESET_ROOT');
|
||||||
|
setState(state);
|
||||||
|
});
|
||||||
|
},
|
||||||
|
[performTransaction, setState, trackAction]
|
||||||
|
);
|
||||||
|
|
||||||
|
const getRootState = React.useCallback(() => {
|
||||||
|
return getStateForRoute('root');
|
||||||
|
}, [getStateForRoute]);
|
||||||
|
|
||||||
|
const emitter = useEventEmitter();
|
||||||
|
|
||||||
|
React.useImperativeHandle(ref, () => ({
|
||||||
|
...(Object.keys(CommonActions) as (keyof typeof CommonActions)[]).reduce<
|
||||||
|
any
|
||||||
|
>((acc, name) => {
|
||||||
|
acc[name] = (...args: any[]) =>
|
||||||
|
dispatch(
|
||||||
|
CommonActions[name](
|
||||||
|
// @ts-ignore
|
||||||
|
...args
|
||||||
|
)
|
||||||
|
);
|
||||||
|
return acc;
|
||||||
|
}, {}),
|
||||||
|
...emitter.create('root'),
|
||||||
|
resetRoot,
|
||||||
|
dispatch,
|
||||||
|
canGoBack,
|
||||||
|
getRootState,
|
||||||
|
}));
|
||||||
|
|
||||||
|
const builderContext = React.useMemo(
|
||||||
|
() => ({
|
||||||
|
addFocusedListener,
|
||||||
|
addStateGetter,
|
||||||
|
trackAction,
|
||||||
|
}),
|
||||||
|
[addFocusedListener, trackAction, addStateGetter]
|
||||||
|
);
|
||||||
|
|
||||||
|
const context = React.useMemo(
|
||||||
|
() => ({
|
||||||
|
state,
|
||||||
|
performTransaction,
|
||||||
|
getState,
|
||||||
|
setState,
|
||||||
|
}),
|
||||||
|
[getState, performTransaction, setState, state]
|
||||||
|
);
|
||||||
|
|
||||||
|
React.useEffect(() => {
|
||||||
|
if (process.env.NODE_ENV !== 'production') {
|
||||||
|
if (
|
||||||
|
state !== undefined &&
|
||||||
|
!isSerializable(state) &&
|
||||||
|
!hasWarnedForSerialization
|
||||||
|
) {
|
||||||
|
hasWarnedForSerialization = true;
|
||||||
|
|
||||||
|
console.warn(
|
||||||
|
"We found non-serializable values in the navigation state, which can break usage such as persisting and restoring state. This might happen if you passed non-serializable values such as function, class instances etc. in params. If you need to use functions in your options, you can use 'navigation.setOptions' instead."
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
emitter.emit({
|
||||||
|
type: 'state',
|
||||||
|
data: { state },
|
||||||
|
});
|
||||||
|
|
||||||
|
if (skipTrackingRef.current) {
|
||||||
|
skipTrackingRef.current = false;
|
||||||
|
} else {
|
||||||
|
trackState(getRootState);
|
||||||
|
}
|
||||||
|
|
||||||
|
navigationStateRef.current = state;
|
||||||
|
transactionStateRef.current = null;
|
||||||
|
|
||||||
|
if (!isFirstMountRef.current && onStateChange) {
|
||||||
|
onStateChange(getRootState());
|
||||||
|
}
|
||||||
|
|
||||||
|
isFirstMountRef.current = false;
|
||||||
|
}, [state, onStateChange, trackState, getRootState, emitter]);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<NavigationBuilderContext.Provider value={builderContext}>
|
||||||
|
<NavigationStateContext.Provider value={context}>
|
||||||
|
<EnsureSingleNavigator>{children}</EnsureSingleNavigator>
|
||||||
|
</NavigationStateContext.Provider>
|
||||||
|
</NavigationBuilderContext.Provider>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
export default BaseNavigationContainer;
|
||||||
@@ -1,4 +1,3 @@
|
|||||||
import shortid from 'shortid';
|
|
||||||
import { CommonAction, NavigationState, PartialState } from './types';
|
import { CommonAction, NavigationState, PartialState } from './types';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -11,35 +10,6 @@ const BaseRouter = {
|
|||||||
action: CommonAction
|
action: CommonAction
|
||||||
): State | PartialState<State> | null {
|
): State | PartialState<State> | null {
|
||||||
switch (action.type) {
|
switch (action.type) {
|
||||||
case 'REPLACE': {
|
|
||||||
const index = action.source
|
|
||||||
? state.routes.findIndex(r => r.key === action.source)
|
|
||||||
: state.index;
|
|
||||||
|
|
||||||
if (index === -1) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
const { name, key, params } = action.payload;
|
|
||||||
|
|
||||||
if (!state.routeNames.includes(name)) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
return {
|
|
||||||
...state,
|
|
||||||
routes: state.routes.map((route, i) =>
|
|
||||||
i === index
|
|
||||||
? {
|
|
||||||
key: key !== undefined ? key : `${name}-${shortid()}`,
|
|
||||||
name,
|
|
||||||
params,
|
|
||||||
}
|
|
||||||
: route
|
|
||||||
),
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
case 'SET_PARAMS': {
|
case 'SET_PARAMS': {
|
||||||
const index = action.source
|
const index = action.source
|
||||||
? state.routes.findIndex(r => r.key === action.source)
|
? state.routes.findIndex(r => r.key === action.source)
|
||||||
|
|||||||
@@ -14,12 +14,6 @@ export type Action =
|
|||||||
source?: string;
|
source?: string;
|
||||||
target?: string;
|
target?: string;
|
||||||
}
|
}
|
||||||
| {
|
|
||||||
type: 'REPLACE';
|
|
||||||
payload: { name: string; key?: string; params?: object };
|
|
||||||
source?: string;
|
|
||||||
target?: string;
|
|
||||||
}
|
|
||||||
| {
|
| {
|
||||||
type: 'RESET';
|
type: 'RESET';
|
||||||
payload: PartialState<NavigationState>;
|
payload: PartialState<NavigationState>;
|
||||||
@@ -59,10 +53,6 @@ export function navigate(...args: any): Action {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export function replace(name: string, params?: object): Action {
|
|
||||||
return { type: 'REPLACE', payload: { name, params } };
|
|
||||||
}
|
|
||||||
|
|
||||||
export function reset(state: PartialState<NavigationState>): Action {
|
export function reset(state: PartialState<NavigationState>): Action {
|
||||||
return { type: 'RESET', payload: state };
|
return { type: 'RESET', payload: state };
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,272 +0,0 @@
|
|||||||
import * as React from 'react';
|
|
||||||
import * as CommonActions from './CommonActions';
|
|
||||||
import EnsureSingleNavigator from './EnsureSingleNavigator';
|
|
||||||
import NavigationBuilderContext from './NavigationBuilderContext';
|
|
||||||
import ResetRootContext from './ResetRootContext';
|
|
||||||
import useFocusedListeners from './useFocusedListeners';
|
|
||||||
import useDevTools from './useDevTools';
|
|
||||||
import useStateGetters from './useStateGetters';
|
|
||||||
|
|
||||||
import {
|
|
||||||
Route,
|
|
||||||
NavigationState,
|
|
||||||
InitialState,
|
|
||||||
PartialState,
|
|
||||||
NavigationAction,
|
|
||||||
NavigationContainerRef,
|
|
||||||
NavigationContainerProps,
|
|
||||||
} from './types';
|
|
||||||
|
|
||||||
type State = NavigationState | PartialState<NavigationState> | undefined;
|
|
||||||
|
|
||||||
const MISSING_CONTEXT_ERROR =
|
|
||||||
"We couldn't find a navigation context. Have you wrapped your app with 'NavigationContainer'?";
|
|
||||||
|
|
||||||
export const NavigationStateContext = React.createContext<{
|
|
||||||
isDefault?: true;
|
|
||||||
state?: NavigationState | PartialState<NavigationState>;
|
|
||||||
getState: () => NavigationState | PartialState<NavigationState> | undefined;
|
|
||||||
setState: (
|
|
||||||
state: NavigationState | PartialState<NavigationState> | undefined
|
|
||||||
) => void;
|
|
||||||
key?: string;
|
|
||||||
performTransaction: (action: () => void) => void;
|
|
||||||
}>({
|
|
||||||
isDefault: true,
|
|
||||||
|
|
||||||
get getState(): any {
|
|
||||||
throw new Error(MISSING_CONTEXT_ERROR);
|
|
||||||
},
|
|
||||||
get setState(): any {
|
|
||||||
throw new Error(MISSING_CONTEXT_ERROR);
|
|
||||||
},
|
|
||||||
get performTransaction(): any {
|
|
||||||
throw new Error(MISSING_CONTEXT_ERROR);
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Remove `key` and `routeNames` from the state objects recursively to get partial state.
|
|
||||||
*
|
|
||||||
* @param state Initial state object.
|
|
||||||
*/
|
|
||||||
const getPartialState = (
|
|
||||||
state: InitialState | undefined
|
|
||||||
): PartialState<NavigationState> | undefined => {
|
|
||||||
if (state === undefined) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
||||||
const { key, routeNames, ...partialState } = state;
|
|
||||||
|
|
||||||
// @ts-ignore
|
|
||||||
return {
|
|
||||||
...partialState,
|
|
||||||
stale: true,
|
|
||||||
routes: state.routes.map(route => {
|
|
||||||
if (route.state === undefined) {
|
|
||||||
return route as Route<string> & {
|
|
||||||
state?: PartialState<NavigationState>;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
return { ...route, state: getPartialState(route.state) };
|
|
||||||
}),
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Container component which holds the navigation state.
|
|
||||||
* This should be rendered at the root wrapping the whole app.
|
|
||||||
*
|
|
||||||
* @param props.initialState Initial state object for the navigation tree.
|
|
||||||
* @param props.onStateChange Callback which is called with the latest navigation state when it changes.
|
|
||||||
* @param props.children Child elements to render the content.
|
|
||||||
* @param props.ref Ref object which refers to the navigation object containing helper methods.
|
|
||||||
*/
|
|
||||||
const Container = React.forwardRef(function NavigationContainer(
|
|
||||||
{
|
|
||||||
initialState,
|
|
||||||
onStateChange,
|
|
||||||
independent,
|
|
||||||
children,
|
|
||||||
}: NavigationContainerProps,
|
|
||||||
ref: React.Ref<NavigationContainerRef>
|
|
||||||
) {
|
|
||||||
const parent = React.useContext(NavigationStateContext);
|
|
||||||
|
|
||||||
if (!parent.isDefault && !independent) {
|
|
||||||
throw new Error(
|
|
||||||
"Looks like you have nested a 'NavigationContainer' inside another. Normally you need only one container at the root of the app, so this was probably an error. If this was intentional, pass 'independent={true}' explicitely."
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
const [state, setNavigationState] = React.useState<State>(() =>
|
|
||||||
getPartialState(initialState == null ? undefined : initialState)
|
|
||||||
);
|
|
||||||
|
|
||||||
const navigationStateRef = React.useRef<State>();
|
|
||||||
const transactionStateRef = React.useRef<State | null>(null);
|
|
||||||
const isTransactionActiveRef = React.useRef<boolean>(false);
|
|
||||||
const isFirstMountRef = React.useRef<boolean>(true);
|
|
||||||
const skipTrackingRef = React.useRef<boolean>(false);
|
|
||||||
|
|
||||||
const performTransaction = React.useCallback((callback: () => void) => {
|
|
||||||
if (isTransactionActiveRef.current) {
|
|
||||||
throw new Error(
|
|
||||||
"Only one transaction can be active at a time. Did you accidentally nest 'performTransaction'?"
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
setNavigationState((navigationState: State) => {
|
|
||||||
isTransactionActiveRef.current = true;
|
|
||||||
transactionStateRef.current = navigationState;
|
|
||||||
|
|
||||||
try {
|
|
||||||
callback();
|
|
||||||
} finally {
|
|
||||||
isTransactionActiveRef.current = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return transactionStateRef.current;
|
|
||||||
});
|
|
||||||
}, []);
|
|
||||||
|
|
||||||
const getState = React.useCallback(
|
|
||||||
() =>
|
|
||||||
transactionStateRef.current !== null
|
|
||||||
? transactionStateRef.current
|
|
||||||
: navigationStateRef.current,
|
|
||||||
[]
|
|
||||||
);
|
|
||||||
|
|
||||||
const setState = React.useCallback((navigationState: State) => {
|
|
||||||
if (transactionStateRef.current === null) {
|
|
||||||
throw new Error(
|
|
||||||
"Any 'setState' calls need to be done inside 'performTransaction'"
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
transactionStateRef.current = navigationState;
|
|
||||||
}, []);
|
|
||||||
|
|
||||||
const reset = React.useCallback(
|
|
||||||
(state: NavigationState) => {
|
|
||||||
performTransaction(() => {
|
|
||||||
skipTrackingRef.current = true;
|
|
||||||
setState(state);
|
|
||||||
});
|
|
||||||
},
|
|
||||||
[performTransaction, setState]
|
|
||||||
);
|
|
||||||
|
|
||||||
const { trackState, trackAction } = useDevTools({
|
|
||||||
name: '@react-navigation',
|
|
||||||
reset,
|
|
||||||
state,
|
|
||||||
});
|
|
||||||
|
|
||||||
const { listeners, addListener: addFocusedListener } = useFocusedListeners();
|
|
||||||
|
|
||||||
const { getStateForRoute, addStateGetter } = useStateGetters();
|
|
||||||
|
|
||||||
const dispatch = (
|
|
||||||
action: NavigationAction | ((state: NavigationState) => NavigationAction)
|
|
||||||
) => {
|
|
||||||
listeners[0](navigation => navigation.dispatch(action));
|
|
||||||
};
|
|
||||||
|
|
||||||
const canGoBack = () => {
|
|
||||||
const { result, handled } = listeners[0](navigation =>
|
|
||||||
navigation.canGoBack()
|
|
||||||
);
|
|
||||||
|
|
||||||
if (handled) {
|
|
||||||
return result;
|
|
||||||
} else {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
const resetRoot = React.useCallback(
|
|
||||||
(state?: PartialState<NavigationState> | NavigationState) => {
|
|
||||||
performTransaction(() => {
|
|
||||||
trackAction('@@RESET_ROOT');
|
|
||||||
setState(state);
|
|
||||||
});
|
|
||||||
},
|
|
||||||
[performTransaction, setState, trackAction]
|
|
||||||
);
|
|
||||||
|
|
||||||
const getRootState = React.useCallback(() => {
|
|
||||||
return getStateForRoute('root');
|
|
||||||
}, [getStateForRoute]);
|
|
||||||
|
|
||||||
React.useImperativeHandle(ref, () => ({
|
|
||||||
...(Object.keys(CommonActions) as (keyof typeof CommonActions)[]).reduce<
|
|
||||||
any
|
|
||||||
>((acc, name) => {
|
|
||||||
acc[name] = (...args: any[]) =>
|
|
||||||
dispatch(
|
|
||||||
CommonActions[name](
|
|
||||||
// @ts-ignore
|
|
||||||
...args
|
|
||||||
)
|
|
||||||
);
|
|
||||||
return acc;
|
|
||||||
}, {}),
|
|
||||||
resetRoot,
|
|
||||||
dispatch,
|
|
||||||
canGoBack,
|
|
||||||
getRootState,
|
|
||||||
}));
|
|
||||||
|
|
||||||
const builderContext = React.useMemo(
|
|
||||||
() => ({
|
|
||||||
addFocusedListener,
|
|
||||||
addStateGetter,
|
|
||||||
trackAction,
|
|
||||||
}),
|
|
||||||
[addFocusedListener, trackAction, addStateGetter]
|
|
||||||
);
|
|
||||||
|
|
||||||
const context = React.useMemo(
|
|
||||||
() => ({
|
|
||||||
state,
|
|
||||||
performTransaction,
|
|
||||||
getState,
|
|
||||||
setState,
|
|
||||||
}),
|
|
||||||
[getState, performTransaction, setState, state]
|
|
||||||
);
|
|
||||||
|
|
||||||
React.useEffect(() => {
|
|
||||||
if (skipTrackingRef.current) {
|
|
||||||
skipTrackingRef.current = false;
|
|
||||||
} else {
|
|
||||||
trackState(getRootState);
|
|
||||||
}
|
|
||||||
|
|
||||||
navigationStateRef.current = state;
|
|
||||||
transactionStateRef.current = null;
|
|
||||||
|
|
||||||
if (!isFirstMountRef.current && onStateChange) {
|
|
||||||
onStateChange(getRootState());
|
|
||||||
}
|
|
||||||
|
|
||||||
isFirstMountRef.current = false;
|
|
||||||
}, [state, onStateChange, trackState, getRootState]);
|
|
||||||
|
|
||||||
return (
|
|
||||||
<NavigationBuilderContext.Provider value={builderContext}>
|
|
||||||
<NavigationStateContext.Provider value={context}>
|
|
||||||
<ResetRootContext.Provider value={resetRoot}>
|
|
||||||
<EnsureSingleNavigator>{children}</EnsureSingleNavigator>
|
|
||||||
</ResetRootContext.Provider>
|
|
||||||
</NavigationStateContext.Provider>
|
|
||||||
</NavigationBuilderContext.Provider>
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
export default Container;
|
|
||||||
@@ -1,15 +0,0 @@
|
|||||||
import * as React from 'react';
|
|
||||||
import { NavigationState, PartialState } from './types';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Context which holds the method to reset root navigator state.
|
|
||||||
*/
|
|
||||||
const ResetRootContext = React.createContext<
|
|
||||||
(state: PartialState<NavigationState> | NavigationState) => void
|
|
||||||
>(() => {
|
|
||||||
throw new Error(
|
|
||||||
"We couldn't find a way to reset root state. Have you wrapped your app with 'NavigationContainer'?"
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
export default ResetRootContext;
|
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
import * as React from 'react';
|
import * as React from 'react';
|
||||||
import { NavigationStateContext } from './NavigationContainer';
|
import { NavigationStateContext } from './BaseNavigationContainer';
|
||||||
import NavigationContext from './NavigationContext';
|
import NavigationContext from './NavigationContext';
|
||||||
import NavigationRouteContext from './NavigationRouteContext';
|
import NavigationRouteContext from './NavigationRouteContext';
|
||||||
import StaticContainer from './StaticContainer';
|
import StaticContainer from './StaticContainer';
|
||||||
|
|||||||