mirror of
https://github.com/zhigang1992/react-navigation.git
synced 2026-01-16 09:32:31 +08:00
Compare commits
11 Commits
@react-nav
...
@react-nav
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
7ac4c13d44 | ||
|
|
a0b9f94120 | ||
|
|
717dffdb81 | ||
|
|
9016ba00e3 | ||
|
|
9d822b95a6 | ||
|
|
52d5cb4179 | ||
|
|
af1722d1e9 | ||
|
|
0b1a718756 | ||
|
|
9ab29558d0 | ||
|
|
00c23f2c9e | ||
|
|
68e750d5a6 |
@@ -22,13 +22,14 @@ jobs:
|
|||||||
- attach_project
|
- attach_project
|
||||||
- restore_cache:
|
- restore_cache:
|
||||||
keys:
|
keys:
|
||||||
- v2-dependencies-{{ checksum "yarn.lock" }}
|
- yarn-packages-v1-{{ .Branch }}-{{ checksum "yarn.lock" }}
|
||||||
- v2-dependencies-
|
- yarn-packages-v1-{{ .Branch }}-
|
||||||
|
- yarn-packages-v1-
|
||||||
- run:
|
- run:
|
||||||
name: Install project dependencies
|
name: Install project dependencies
|
||||||
command: yarn install --frozen-lockfile
|
command: yarn install --frozen-lockfile
|
||||||
- save_cache:
|
- save_cache:
|
||||||
key: v2-dependencies-{{ checksum "yarn.lock" }}
|
key: yarn-packages-v1-{{ .Branch }}-{{ checksum "yarn.lock" }}
|
||||||
paths: ~/.cache/yarn
|
paths: ~/.cache/yarn
|
||||||
- persist_to_workspace:
|
- persist_to_workspace:
|
||||||
root: .
|
root: .
|
||||||
|
|||||||
18
.github/workflows/expo-preview.yml
vendored
18
.github/workflows/expo-preview.yml
vendored
@@ -23,20 +23,18 @@ jobs:
|
|||||||
expo-password: ${{ secrets.EXPO_CLI_PASSWORD }}
|
expo-password: ${{ secrets.EXPO_CLI_PASSWORD }}
|
||||||
expo-cache: true
|
expo-cache: true
|
||||||
|
|
||||||
- name: Get yarn cache
|
- name: Restore yarn cache
|
||||||
id: yarn-cache
|
id: yarn-cache
|
||||||
run: echo "::set-output name=dir::$(yarn cache dir)"
|
uses: actions/cache@master
|
||||||
|
|
||||||
- name: Check yarn cache
|
|
||||||
uses: actions/cache@v1
|
|
||||||
with:
|
with:
|
||||||
path: ${{ steps.yarn-cache.outputs.dir }}
|
path: |
|
||||||
key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}
|
node_modules
|
||||||
restore-keys: |
|
*/*/node_modules
|
||||||
${{ runner.os }}-yarn-
|
key: ${{ runner.os }}-yarn-v1-${{ hashFiles('**/yarn.lock') }}
|
||||||
|
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
run: yarn
|
if: steps.yarn-cache.outputs.cache-hit != 'true'
|
||||||
|
run: yarn install --frozen-lockfile
|
||||||
|
|
||||||
- name: Publish Expo app
|
- name: Publish Expo app
|
||||||
working-directory: ./example
|
working-directory: ./example
|
||||||
|
|||||||
17
.github/workflows/expo.yml
vendored
17
.github/workflows/expo.yml
vendored
@@ -25,19 +25,18 @@ jobs:
|
|||||||
expo-password: ${{ secrets.EXPO_CLI_PASSWORD }}
|
expo-password: ${{ secrets.EXPO_CLI_PASSWORD }}
|
||||||
expo-cache: true
|
expo-cache: true
|
||||||
|
|
||||||
- name: Get yarn cache
|
- name: Restore yarn cache
|
||||||
id: yarn-cache
|
id: yarn-cache
|
||||||
run: echo "::set-output name=dir::$(yarn cache dir)"
|
uses: actions/cache@master
|
||||||
|
|
||||||
- uses: actions/cache@v1
|
|
||||||
with:
|
with:
|
||||||
path: ${{ steps.yarn-cache.outputs.dir }}
|
path: |
|
||||||
key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}
|
node_modules
|
||||||
restore-keys: |
|
*/*/node_modules
|
||||||
${{ runner.os }}-yarn-
|
key: ${{ runner.os }}-yarn-v1-${{ hashFiles('**/yarn.lock') }}
|
||||||
|
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
run: yarn
|
if: steps.yarn-cache.outputs.cache-hit != 'true'
|
||||||
|
run: yarn install --frozen-lockfile
|
||||||
|
|
||||||
- name: Publish Expo app
|
- name: Publish Expo app
|
||||||
working-directory: ./example
|
working-directory: ./example
|
||||||
|
|||||||
@@ -1,6 +1,10 @@
|
|||||||
import 'react-native-gesture-handler';
|
import 'react-native-gesture-handler';
|
||||||
import { registerRootComponent } from 'expo';
|
import { registerRootComponent } from 'expo';
|
||||||
|
import { Asset } from 'expo-asset';
|
||||||
|
import { Assets as StackAssets } from '@react-navigation/stack';
|
||||||
|
|
||||||
import App from './src/index';
|
import App from './src/index';
|
||||||
|
|
||||||
|
Asset.loadAsync(StackAssets);
|
||||||
|
|
||||||
registerRootComponent(App);
|
registerRootComponent(App);
|
||||||
|
|||||||
13
example/e2e/__integration_tests__/server.test.tsx
Normal file
13
example/e2e/__integration_tests__/server.test.tsx
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
import fetch from 'node-fetch';
|
||||||
|
import cheerio from 'cheerio';
|
||||||
|
|
||||||
|
const server = 'http://localhost:3275';
|
||||||
|
|
||||||
|
it('renders the home page', async () => {
|
||||||
|
const res = await fetch(server);
|
||||||
|
const html = await res.text();
|
||||||
|
|
||||||
|
const $ = cheerio.load(html);
|
||||||
|
|
||||||
|
expect($('title').text()).toBe('Examples');
|
||||||
|
});
|
||||||
@@ -1,8 +1,16 @@
|
|||||||
import { setup } from 'jest-dev-server';
|
import { setup } from 'jest-dev-server';
|
||||||
|
|
||||||
export default async function () {
|
export default async function () {
|
||||||
await setup({
|
await setup([
|
||||||
|
{
|
||||||
command: 'yarn serve -l 3579 web-build',
|
command: 'yarn serve -l 3579 web-build',
|
||||||
|
launchTimeout: 50000,
|
||||||
port: 3579,
|
port: 3579,
|
||||||
});
|
},
|
||||||
|
{
|
||||||
|
command: 'yarn server',
|
||||||
|
launchTimeout: 50000,
|
||||||
|
port: 3275,
|
||||||
|
},
|
||||||
|
]);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,6 +9,7 @@
|
|||||||
"native": "react-native start",
|
"native": "react-native start",
|
||||||
"android": "react-native run-android",
|
"android": "react-native run-android",
|
||||||
"ios": "react-native run-ios",
|
"ios": "react-native run-ios",
|
||||||
|
"server": "nodemon -e '.js,.ts,.tsx' --exec \"babel-node -i '/node_modules[/\\](?react-native)/' -x '.web.tsx,.web.ts,.web.js,.tsx,.ts,.js' --config-file ./server/babel.config.js server\"",
|
||||||
"test": "jest"
|
"test": "jest"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
@@ -18,6 +19,7 @@
|
|||||||
"expo": "^37.0.8",
|
"expo": "^37.0.8",
|
||||||
"expo-asset": "~8.1.3",
|
"expo-asset": "~8.1.3",
|
||||||
"expo-blur": "~8.1.0",
|
"expo-blur": "~8.1.0",
|
||||||
|
"koa": "^2.12.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",
|
||||||
@@ -29,17 +31,28 @@
|
|||||||
"react-native-screens": "^2.7.0",
|
"react-native-screens": "^2.7.0",
|
||||||
"react-native-tab-view": "2.14.0",
|
"react-native-tab-view": "2.14.0",
|
||||||
"react-native-unimodules": "~0.9.1",
|
"react-native-unimodules": "~0.9.1",
|
||||||
|
"react-native-vector-icons": "^6.6.0",
|
||||||
"react-native-web": "^0.11.7"
|
"react-native-web": "^0.11.7"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
"@babel/node": "^7.8.7",
|
||||||
"@expo/webpack-config": "^0.11.19",
|
"@expo/webpack-config": "^0.11.19",
|
||||||
|
"@types/cheerio": "^0.22.18",
|
||||||
"@types/jest-dev-server": "^4.2.0",
|
"@types/jest-dev-server": "^4.2.0",
|
||||||
|
"@types/koa": "^2.11.3",
|
||||||
|
"@types/node-fetch": "^2.5.7",
|
||||||
"@types/react": "^16.9.34",
|
"@types/react": "^16.9.34",
|
||||||
|
"@types/react-dom": "^16.9.8",
|
||||||
"@types/react-native": "^0.62.7",
|
"@types/react-native": "^0.62.7",
|
||||||
|
"babel-plugin-module-resolver": "^4.0.0",
|
||||||
"babel-preset-expo": "^8.1.0",
|
"babel-preset-expo": "^8.1.0",
|
||||||
|
"cheerio": "^1.0.0-rc.3",
|
||||||
"expo-cli": "^3.20.1",
|
"expo-cli": "^3.20.1",
|
||||||
"jest": "^26.0.1",
|
"jest": "^26.0.1",
|
||||||
"jest-dev-server": "^4.4.0",
|
"jest-dev-server": "^4.4.0",
|
||||||
|
"mock-require-assets": "^0.0.1",
|
||||||
|
"node-fetch": "^2.6.0",
|
||||||
|
"nodemon": "^2.0.4",
|
||||||
"playwright": "^0.14.0",
|
"playwright": "^0.14.0",
|
||||||
"serve": "^11.3.0",
|
"serve": "^11.3.0",
|
||||||
"typescript": "^3.8.3"
|
"typescript": "^3.8.3"
|
||||||
|
|||||||
40
example/server/babel.config.js
Normal file
40
example/server/babel.config.js
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
const path = require('path');
|
||||||
|
const fs = require('fs');
|
||||||
|
|
||||||
|
const packages = path.resolve(__dirname, '..', '..', 'packages');
|
||||||
|
|
||||||
|
const alias = Object.fromEntries(
|
||||||
|
fs
|
||||||
|
.readdirSync(packages)
|
||||||
|
.filter((name) => !name.startsWith('.'))
|
||||||
|
.map((name) => [
|
||||||
|
`@react-navigation/${name}`,
|
||||||
|
path.resolve(
|
||||||
|
packages,
|
||||||
|
name,
|
||||||
|
require(`../../packages/${name}/package.json`).source
|
||||||
|
),
|
||||||
|
])
|
||||||
|
);
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
presets: [
|
||||||
|
'@babel/preset-env',
|
||||||
|
'@babel/preset-flow',
|
||||||
|
'@babel/preset-typescript',
|
||||||
|
'@babel/preset-react',
|
||||||
|
],
|
||||||
|
plugins: [
|
||||||
|
'@babel/plugin-proposal-class-properties',
|
||||||
|
[
|
||||||
|
'module-resolver',
|
||||||
|
{
|
||||||
|
root: ['..'],
|
||||||
|
alias: {
|
||||||
|
'react-native': 'react-native-web',
|
||||||
|
...alias,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
],
|
||||||
|
};
|
||||||
54
example/server/index.tsx
Normal file
54
example/server/index.tsx
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
import './resolve-hooks';
|
||||||
|
|
||||||
|
import Koa from 'koa';
|
||||||
|
import * as React from 'react';
|
||||||
|
import ReactDOMServer from 'react-dom/server';
|
||||||
|
import { AppRegistry } from 'react-native-web';
|
||||||
|
import { ServerContainer, ServerContainerRef } from '@react-navigation/native';
|
||||||
|
import App from '../src/index';
|
||||||
|
|
||||||
|
AppRegistry.registerComponent('App', () => App);
|
||||||
|
|
||||||
|
const PORT = process.env.PORT || 3275;
|
||||||
|
|
||||||
|
const app = new Koa();
|
||||||
|
|
||||||
|
app.use(async (ctx) => {
|
||||||
|
const { element, getStyleElement } = AppRegistry.getApplication('App');
|
||||||
|
|
||||||
|
const ref = React.createRef<ServerContainerRef>();
|
||||||
|
|
||||||
|
const html = ReactDOMServer.renderToString(
|
||||||
|
<ServerContainer
|
||||||
|
ref={ref}
|
||||||
|
location={{ pathname: ctx.path, search: ctx.search }}
|
||||||
|
>
|
||||||
|
{element}
|
||||||
|
</ServerContainer>
|
||||||
|
);
|
||||||
|
|
||||||
|
const css = ReactDOMServer.renderToStaticMarkup(getStyleElement());
|
||||||
|
|
||||||
|
const document = `
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html style="height: 100%">
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<meta httpEquiv="X-UA-Compatible" content="IE=edge">
|
||||||
|
<meta
|
||||||
|
name="viewport"
|
||||||
|
content="width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1.00001, viewport-fit=cover"
|
||||||
|
>
|
||||||
|
${css}
|
||||||
|
<title>${ref.current?.getCurrentOptions()?.title}</title>
|
||||||
|
<body style="height: 100%">
|
||||||
|
<div id="root" style="display: flex; height: 100%">
|
||||||
|
${html}
|
||||||
|
</div>
|
||||||
|
`;
|
||||||
|
|
||||||
|
ctx.body = document;
|
||||||
|
});
|
||||||
|
|
||||||
|
app.listen(PORT, () => {
|
||||||
|
console.log(`Running at http://localhost:${PORT}`);
|
||||||
|
});
|
||||||
12
example/server/resolve-hooks.tsx
Normal file
12
example/server/resolve-hooks.tsx
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
import 'mock-require-assets';
|
||||||
|
|
||||||
|
import Module from 'module';
|
||||||
|
|
||||||
|
// We need to make sure that .web.xx extensions are resolved before .xx
|
||||||
|
// @ts-ignore
|
||||||
|
Module._extensions = Object.fromEntries(
|
||||||
|
// @ts-ignore
|
||||||
|
Object.entries(Module._extensions).sort((a, b) => {
|
||||||
|
return b[0].split('.').length - a[0].split('.').length;
|
||||||
|
})
|
||||||
|
);
|
||||||
11
example/src/Restart.native.tsx
Normal file
11
example/src/Restart.native.tsx
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
import RNRestart from 'react-native-restart';
|
||||||
|
import { Updates } from 'expo';
|
||||||
|
|
||||||
|
export function restartApp() {
|
||||||
|
// @ts-ignore
|
||||||
|
if (global.Expo) {
|
||||||
|
Updates.reloadFromCache();
|
||||||
|
} else {
|
||||||
|
RNRestart.Restart();
|
||||||
|
}
|
||||||
|
}
|
||||||
1
example/src/Restart.tsx
Normal file
1
example/src/Restart.tsx
Normal file
@@ -0,0 +1 @@
|
|||||||
|
export function restartApp() {}
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
import * as React from 'react';
|
import * as React from 'react';
|
||||||
import { View, ScrollView, StyleSheet, Platform } from 'react-native';
|
import { View, ScrollView, StyleSheet, Platform } from 'react-native';
|
||||||
import { Button } from 'react-native-paper';
|
import { Button } from 'react-native-paper';
|
||||||
import { MaterialCommunityIcons } from '@expo/vector-icons';
|
import MaterialCommunityIcons from 'react-native-vector-icons/MaterialCommunityIcons';
|
||||||
import {
|
import {
|
||||||
createBottomTabNavigator,
|
createBottomTabNavigator,
|
||||||
BottomTabNavigationProp,
|
BottomTabNavigationProp,
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import * as React from 'react';
|
import * as React from 'react';
|
||||||
import { View, StyleSheet } from 'react-native';
|
import { View, StyleSheet } from 'react-native';
|
||||||
import { Title, Button } from 'react-native-paper';
|
import { Title, Button } from 'react-native-paper';
|
||||||
import { Feather } from '@expo/vector-icons';
|
import Feather from 'react-native-vector-icons/Feather';
|
||||||
import { createBottomTabNavigator } from '@react-navigation/bottom-tabs';
|
import { createBottomTabNavigator } from '@react-navigation/bottom-tabs';
|
||||||
|
|
||||||
type BottomTabParams = {
|
type BottomTabParams = {
|
||||||
|
|||||||
@@ -1,8 +1,7 @@
|
|||||||
import * as React from 'react';
|
import * as React from 'react';
|
||||||
import { View, StyleSheet, ScrollView, Alert, Platform } from 'react-native';
|
import { View, StyleSheet, ScrollView, Alert, Platform } from 'react-native';
|
||||||
import { Button, Appbar } from 'react-native-paper';
|
import { Button, Appbar } from 'react-native-paper';
|
||||||
import { BlurView } from 'expo-blur';
|
import MaterialCommunityIcons from 'react-native-vector-icons/MaterialCommunityIcons';
|
||||||
import { MaterialCommunityIcons } from '@expo/vector-icons';
|
|
||||||
import { RouteProp, ParamListBase } from '@react-navigation/native';
|
import { RouteProp, ParamListBase } from '@react-navigation/native';
|
||||||
import {
|
import {
|
||||||
createStackNavigator,
|
createStackNavigator,
|
||||||
@@ -10,6 +9,7 @@ import {
|
|||||||
HeaderBackground,
|
HeaderBackground,
|
||||||
useHeaderHeight,
|
useHeaderHeight,
|
||||||
} from '@react-navigation/stack';
|
} from '@react-navigation/stack';
|
||||||
|
import BlurView from '../Shared/BlurView';
|
||||||
import Article from '../Shared/Article';
|
import Article from '../Shared/Article';
|
||||||
import Albums from '../Shared/Albums';
|
import Albums from '../Shared/Albums';
|
||||||
|
|
||||||
|
|||||||
3
example/src/Shared/BlurView.native.tsx
Normal file
3
example/src/Shared/BlurView.native.tsx
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
import { BlurView } from 'expo-blur';
|
||||||
|
|
||||||
|
export default BlurView;
|
||||||
12
example/src/Shared/BlurView.tsx
Normal file
12
example/src/Shared/BlurView.tsx
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
import * as React from 'react';
|
||||||
|
import { View, ViewProps } from 'react-native';
|
||||||
|
|
||||||
|
type Props = ViewProps & {
|
||||||
|
tint: 'light' | 'dark';
|
||||||
|
intensity: number;
|
||||||
|
};
|
||||||
|
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||||||
|
export default function BlurView({ tint, intensity, ...rest }: Props) {
|
||||||
|
return <View {...rest} />;
|
||||||
|
}
|
||||||
@@ -11,10 +11,7 @@ import {
|
|||||||
} from 'react-native';
|
} from 'react-native';
|
||||||
// eslint-disable-next-line import/no-unresolved
|
// eslint-disable-next-line import/no-unresolved
|
||||||
import { enableScreens } from 'react-native-screens';
|
import { enableScreens } from 'react-native-screens';
|
||||||
import RNRestart from 'react-native-restart';
|
import MaterialIcons from 'react-native-vector-icons/MaterialIcons';
|
||||||
import { Updates } from 'expo';
|
|
||||||
import { Asset } from 'expo-asset';
|
|
||||||
import { MaterialIcons } from '@expo/vector-icons';
|
|
||||||
import {
|
import {
|
||||||
Provider as PaperProvider,
|
Provider as PaperProvider,
|
||||||
DefaultTheme as PaperLightTheme,
|
DefaultTheme as PaperLightTheme,
|
||||||
@@ -36,11 +33,11 @@ import {
|
|||||||
} from '@react-navigation/drawer';
|
} from '@react-navigation/drawer';
|
||||||
import {
|
import {
|
||||||
createStackNavigator,
|
createStackNavigator,
|
||||||
Assets as StackAssets,
|
|
||||||
StackNavigationProp,
|
StackNavigationProp,
|
||||||
HeaderStyleInterpolators,
|
HeaderStyleInterpolators,
|
||||||
} from '@react-navigation/stack';
|
} from '@react-navigation/stack';
|
||||||
|
|
||||||
|
import { restartApp } from './Restart';
|
||||||
import AsyncStorage from './AsyncStorage';
|
import AsyncStorage from './AsyncStorage';
|
||||||
import LinkingPrefixes from './LinkingPrefixes';
|
import LinkingPrefixes from './LinkingPrefixes';
|
||||||
import SettingsItem from './Shared/SettingsItem';
|
import SettingsItem from './Shared/SettingsItem';
|
||||||
@@ -126,12 +123,10 @@ const Stack = createStackNavigator<RootStackParamList>();
|
|||||||
const NAVIGATION_PERSISTENCE_KEY = 'NAVIGATION_STATE';
|
const NAVIGATION_PERSISTENCE_KEY = 'NAVIGATION_STATE';
|
||||||
const THEME_PERSISTENCE_KEY = 'THEME_TYPE';
|
const THEME_PERSISTENCE_KEY = 'THEME_TYPE';
|
||||||
|
|
||||||
Asset.loadAsync(StackAssets);
|
|
||||||
|
|
||||||
export default function App() {
|
export default function App() {
|
||||||
const [theme, setTheme] = React.useState(DefaultTheme);
|
const [theme, setTheme] = React.useState(DefaultTheme);
|
||||||
|
|
||||||
const [isReady, setIsReady] = React.useState(false);
|
const [isReady, setIsReady] = React.useState(Platform.OS === 'web');
|
||||||
const [initialState, setInitialState] = React.useState<
|
const [initialState, setInitialState] = React.useState<
|
||||||
InitialState | undefined
|
InitialState | undefined
|
||||||
>();
|
>();
|
||||||
@@ -307,12 +302,7 @@ export default function App() {
|
|||||||
value={I18nManager.isRTL}
|
value={I18nManager.isRTL}
|
||||||
onValueChange={() => {
|
onValueChange={() => {
|
||||||
I18nManager.forceRTL(!I18nManager.isRTL);
|
I18nManager.forceRTL(!I18nManager.isRTL);
|
||||||
// @ts-ignore
|
restartApp();
|
||||||
if (global.Expo) {
|
|
||||||
Updates.reloadFromCache();
|
|
||||||
} else {
|
|
||||||
RNRestart.Restart();
|
|
||||||
}
|
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
<Divider />
|
<Divider />
|
||||||
|
|||||||
16
example/types/react-native-web.d.ts
vendored
Normal file
16
example/types/react-native-web.d.ts
vendored
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
declare module 'react-native-web' {
|
||||||
|
export const AppRegistry: {
|
||||||
|
registerComponent(
|
||||||
|
name: string,
|
||||||
|
callback: () => React.ComponentType<any>
|
||||||
|
): void;
|
||||||
|
|
||||||
|
getApplication(
|
||||||
|
name: string,
|
||||||
|
options?: { initialProps: object }
|
||||||
|
): {
|
||||||
|
element: React.ReactElement;
|
||||||
|
getStyleElement(): React.ReactElement;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -3,6 +3,17 @@
|
|||||||
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.5.1](https://github.com/react-navigation/react-navigation/tree/master/packages/bottom-tabs/compare/@react-navigation/bottom-tabs@5.5.0...@react-navigation/bottom-tabs@5.5.1) (2020-05-27)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* fix type of style for various options ([9d822b9](https://github.com/react-navigation/react-navigation/tree/master/packages/bottom-tabs/commit/9d822b95a6df797e2e63e481573e64ea7d0f9386))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# [5.5.0](https://github.com/react-navigation/react-navigation/tree/master/packages/bottom-tabs/compare/@react-navigation/bottom-tabs@5.4.7...@react-navigation/bottom-tabs@5.5.0) (2020-05-23)
|
# [5.5.0](https://github.com/react-navigation/react-navigation/tree/master/packages/bottom-tabs/compare/@react-navigation/bottom-tabs@5.4.7...@react-navigation/bottom-tabs@5.5.0) (2020-05-23)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "@react-navigation/bottom-tabs",
|
"name": "@react-navigation/bottom-tabs",
|
||||||
"description": "Bottom tab navigator following iOS design guidelines",
|
"description": "Bottom tab navigator following iOS design guidelines",
|
||||||
"version": "5.5.0",
|
"version": "5.5.1",
|
||||||
"keywords": [
|
"keywords": [
|
||||||
"react-native-component",
|
"react-native-component",
|
||||||
"react-component",
|
"react-component",
|
||||||
@@ -37,7 +37,7 @@
|
|||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@react-native-community/bob": "^0.14.3",
|
"@react-native-community/bob": "^0.14.3",
|
||||||
"@react-navigation/native": "^5.4.3",
|
"@react-navigation/native": "^5.5.0",
|
||||||
"@types/color": "^3.0.1",
|
"@types/color": "^3.0.1",
|
||||||
"@types/react": "^16.9.34",
|
"@types/react": "^16.9.34",
|
||||||
"@types/react-native": "^0.62.7",
|
"@types/react-native": "^0.62.7",
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
import * as React from 'react';
|
import * as React from 'react';
|
||||||
import {
|
import {
|
||||||
|
Animated,
|
||||||
TouchableWithoutFeedbackProps,
|
TouchableWithoutFeedbackProps,
|
||||||
StyleProp,
|
StyleProp,
|
||||||
TextStyle,
|
TextStyle,
|
||||||
@@ -197,7 +198,7 @@ export type BottomTabBarOptions = {
|
|||||||
/**
|
/**
|
||||||
* Style object for the tab bar container.
|
* Style object for the tab bar container.
|
||||||
*/
|
*/
|
||||||
style?: StyleProp<ViewStyle>;
|
style?: Animated.WithAnimatedValue<StyleProp<ViewStyle>>;
|
||||||
};
|
};
|
||||||
|
|
||||||
export type BottomTabBarProps = BottomTabBarOptions & {
|
export type BottomTabBarProps = BottomTabBarOptions & {
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
import React from 'react';
|
import React from 'react';
|
||||||
import {
|
import {
|
||||||
View,
|
View,
|
||||||
|
Text,
|
||||||
TouchableWithoutFeedback,
|
TouchableWithoutFeedback,
|
||||||
Animated,
|
|
||||||
StyleSheet,
|
StyleSheet,
|
||||||
Platform,
|
Platform,
|
||||||
StyleProp,
|
StyleProp,
|
||||||
@@ -191,7 +191,7 @@ export default function BottomTabBarItem({
|
|||||||
|
|
||||||
if (typeof label === 'string') {
|
if (typeof label === 'string') {
|
||||||
return (
|
return (
|
||||||
<Animated.Text
|
<Text
|
||||||
numberOfLines={1}
|
numberOfLines={1}
|
||||||
style={[
|
style={[
|
||||||
styles.label,
|
styles.label,
|
||||||
@@ -202,14 +202,10 @@ export default function BottomTabBarItem({
|
|||||||
allowFontScaling={allowFontScaling}
|
allowFontScaling={allowFontScaling}
|
||||||
>
|
>
|
||||||
{label}
|
{label}
|
||||||
</Animated.Text>
|
</Text>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (typeof label === 'string') {
|
|
||||||
return label;
|
|
||||||
}
|
|
||||||
|
|
||||||
return label({ focused, color });
|
return label({ focused, color });
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -3,6 +3,14 @@
|
|||||||
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.1.25](https://github.com/react-navigation/react-navigation/tree/master/packages/compat/compare/@react-navigation/compat@5.1.24...@react-navigation/compat@5.1.25) (2020-05-27)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @react-navigation/compat
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## [5.1.24](https://github.com/react-navigation/react-navigation/tree/master/packages/compat/compare/@react-navigation/compat@5.1.23...@react-navigation/compat@5.1.24) (2020-05-23)
|
## [5.1.24](https://github.com/react-navigation/react-navigation/tree/master/packages/compat/compare/@react-navigation/compat@5.1.23...@react-navigation/compat@5.1.24) (2020-05-23)
|
||||||
|
|
||||||
**Note:** Version bump only for package @react-navigation/compat
|
**Note:** Version bump only for package @react-navigation/compat
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"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.1.24",
|
"version": "5.1.25",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"repository": "https://github.com/react-navigation/react-navigation/tree/master/packages/compat",
|
"repository": "https://github.com/react-navigation/react-navigation/tree/master/packages/compat",
|
||||||
"bugs": {
|
"bugs": {
|
||||||
@@ -28,7 +28,7 @@
|
|||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@react-native-community/bob": "^0.14.3",
|
"@react-native-community/bob": "^0.14.3",
|
||||||
"@react-navigation/native": "^5.4.3",
|
"@react-navigation/native": "^5.5.0",
|
||||||
"@types/react": "^16.9.34",
|
"@types/react": "^16.9.34",
|
||||||
"react": "~16.9.0",
|
"react": "~16.9.0",
|
||||||
"typescript": "^3.8.3"
|
"typescript": "^3.8.3"
|
||||||
|
|||||||
@@ -3,6 +3,17 @@
|
|||||||
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.9.0](https://github.com/react-navigation/react-navigation/tree/master/packages/core/compare/@react-navigation/core@5.8.2...@react-navigation/core@5.9.0) (2020-05-27)
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* add ref to get current options in `ServerContainer` ([#8333](https://github.com/react-navigation/react-navigation/tree/master/packages/core/issues/8333)) ([0b1a718](https://github.com/react-navigation/react-navigation/tree/master/packages/core/commit/0b1a718756e208d84b20e45ca56004332308ad54))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## [5.8.2](https://github.com/react-navigation/react-navigation/tree/master/packages/core/compare/@react-navigation/core@5.8.1...@react-navigation/core@5.8.2) (2020-05-23)
|
## [5.8.2](https://github.com/react-navigation/react-navigation/tree/master/packages/core/compare/@react-navigation/core@5.8.1...@react-navigation/core@5.8.2) (2020-05-23)
|
||||||
|
|
||||||
**Note:** Version bump only for package @react-navigation/core
|
**Note:** Version bump only for package @react-navigation/core
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "@react-navigation/core",
|
"name": "@react-navigation/core",
|
||||||
"description": "Core utilities for building navigators",
|
"description": "Core utilities for building navigators",
|
||||||
"version": "5.8.2",
|
"version": "5.9.0",
|
||||||
"keywords": [
|
"keywords": [
|
||||||
"react",
|
"react",
|
||||||
"react-native",
|
"react-native",
|
||||||
|
|||||||
11
packages/core/src/CurrentRenderContext.tsx
Normal file
11
packages/core/src/CurrentRenderContext.tsx
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
import * as React from 'react';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Context which holds the values for the current navigation tree.
|
||||||
|
* Intended for use in SSR. This is not safe to use on the client.
|
||||||
|
*/
|
||||||
|
const CurrentRenderContext = React.createContext<
|
||||||
|
{ options?: object } | undefined
|
||||||
|
>(undefined);
|
||||||
|
|
||||||
|
export default CurrentRenderContext;
|
||||||
@@ -7,6 +7,8 @@ export { default as NavigationHelpersContext } from './NavigationHelpersContext'
|
|||||||
export { default as NavigationContext } from './NavigationContext';
|
export { default as NavigationContext } from './NavigationContext';
|
||||||
export { default as NavigationRouteContext } from './NavigationRouteContext';
|
export { default as NavigationRouteContext } from './NavigationRouteContext';
|
||||||
|
|
||||||
|
export { default as CurrentRenderContext } from './CurrentRenderContext';
|
||||||
|
|
||||||
export { default as useNavigationBuilder } from './useNavigationBuilder';
|
export { default as useNavigationBuilder } from './useNavigationBuilder';
|
||||||
export { default as useNavigation } from './useNavigation';
|
export { default as useNavigation } from './useNavigation';
|
||||||
export { default as useRoute } from './useRoute';
|
export { default as useRoute } from './useRoute';
|
||||||
|
|||||||
28
packages/core/src/useCurrentRender.tsx
Normal file
28
packages/core/src/useCurrentRender.tsx
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
import * as React from 'react';
|
||||||
|
import { NavigationState, ParamListBase } from '@react-navigation/routers';
|
||||||
|
import CurrentRenderContext from './CurrentRenderContext';
|
||||||
|
import { Descriptor, NavigationHelpers } from './types';
|
||||||
|
|
||||||
|
type Options = {
|
||||||
|
state: NavigationState;
|
||||||
|
navigation: NavigationHelpers<ParamListBase>;
|
||||||
|
descriptors: {
|
||||||
|
[key: string]: Descriptor<ParamListBase, string, NavigationState, object>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Write the current options, so that server renderer can get current values
|
||||||
|
* Mutating values like this is not safe in async mode, but it doesn't apply to SSR
|
||||||
|
*/
|
||||||
|
export default function useCurrentRender({
|
||||||
|
state,
|
||||||
|
navigation,
|
||||||
|
descriptors,
|
||||||
|
}: Options) {
|
||||||
|
const current = React.useContext(CurrentRenderContext);
|
||||||
|
|
||||||
|
if (current && navigation.isFocused()) {
|
||||||
|
current.options = descriptors[state.routes[state.index].key].options;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -12,14 +12,10 @@ export default function useIsFocused(): boolean {
|
|||||||
// eslint-disable-next-line react-hooks/exhaustive-deps
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
||||||
const getCurrentValue = React.useCallback(navigation.isFocused, [navigation]);
|
const getCurrentValue = React.useCallback(navigation.isFocused, [navigation]);
|
||||||
const subscribe = React.useCallback(
|
const subscribe = React.useCallback(
|
||||||
(callback: (value: boolean) => void) => {
|
(callback: () => void) => {
|
||||||
const unsubscribeFocus = navigation.addListener('focus', () =>
|
const unsubscribeFocus = navigation.addListener('focus', callback);
|
||||||
callback(true)
|
|
||||||
);
|
|
||||||
|
|
||||||
const unsubscribeBlur = navigation.addListener('blur', () =>
|
const unsubscribeBlur = navigation.addListener('blur', callback);
|
||||||
callback(false)
|
|
||||||
);
|
|
||||||
|
|
||||||
return () => {
|
return () => {
|
||||||
unsubscribeFocus();
|
unsubscribeFocus();
|
||||||
|
|||||||
@@ -33,6 +33,7 @@ import {
|
|||||||
import useStateGetters from './useStateGetters';
|
import useStateGetters from './useStateGetters';
|
||||||
import useOnGetState from './useOnGetState';
|
import useOnGetState from './useOnGetState';
|
||||||
import useScheduleUpdate from './useScheduleUpdate';
|
import useScheduleUpdate from './useScheduleUpdate';
|
||||||
|
import useCurrentRender from './useCurrentRender';
|
||||||
|
|
||||||
// This is to make TypeScript compiler happy
|
// This is to make TypeScript compiler happy
|
||||||
// eslint-disable-next-line babel/no-unused-expressions
|
// eslint-disable-next-line babel/no-unused-expressions
|
||||||
@@ -498,6 +499,12 @@ export default function useNavigationBuilder<
|
|||||||
emitter,
|
emitter,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
useCurrentRender({
|
||||||
|
state,
|
||||||
|
navigation,
|
||||||
|
descriptors,
|
||||||
|
});
|
||||||
|
|
||||||
return {
|
return {
|
||||||
state,
|
state,
|
||||||
navigation,
|
navigation,
|
||||||
|
|||||||
@@ -3,6 +3,14 @@
|
|||||||
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.8.1](https://github.com/react-navigation/react-navigation/tree/master/packages/drawer/compare/@react-navigation/drawer@5.8.0...@react-navigation/drawer@5.8.1) (2020-05-27)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @react-navigation/drawer
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# [5.8.0](https://github.com/react-navigation/react-navigation/tree/master/packages/drawer/compare/@react-navigation/drawer@5.7.7...@react-navigation/drawer@5.8.0) (2020-05-23)
|
# [5.8.0](https://github.com/react-navigation/react-navigation/tree/master/packages/drawer/compare/@react-navigation/drawer@5.7.7...@react-navigation/drawer@5.8.0) (2020-05-23)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "@react-navigation/drawer",
|
"name": "@react-navigation/drawer",
|
||||||
"description": "Drawer navigator component with animated transitions and gesturess",
|
"description": "Drawer navigator component with animated transitions and gesturess",
|
||||||
"version": "5.8.0",
|
"version": "5.8.1",
|
||||||
"keywords": [
|
"keywords": [
|
||||||
"react-native-component",
|
"react-native-component",
|
||||||
"react-component",
|
"react-component",
|
||||||
@@ -42,7 +42,7 @@
|
|||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@react-native-community/bob": "^0.14.3",
|
"@react-native-community/bob": "^0.14.3",
|
||||||
"@react-navigation/native": "^5.4.3",
|
"@react-navigation/native": "^5.5.0",
|
||||||
"@types/react": "^16.9.34",
|
"@types/react": "^16.9.34",
|
||||||
"@types/react-native": "^0.62.7",
|
"@types/react-native": "^0.62.7",
|
||||||
"del-cli": "^3.0.0",
|
"del-cli": "^3.0.0",
|
||||||
|
|||||||
@@ -3,6 +3,14 @@
|
|||||||
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.2.9](https://github.com/react-navigation/react-navigation/tree/master/packages/material-bottom-tabs/compare/@react-navigation/material-bottom-tabs@5.2.8...@react-navigation/material-bottom-tabs@5.2.9) (2020-05-27)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @react-navigation/material-bottom-tabs
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## [5.2.8](https://github.com/react-navigation/react-navigation/tree/master/packages/material-bottom-tabs/compare/@react-navigation/material-bottom-tabs@5.2.7...@react-navigation/material-bottom-tabs@5.2.8) (2020-05-23)
|
## [5.2.8](https://github.com/react-navigation/react-navigation/tree/master/packages/material-bottom-tabs/compare/@react-navigation/material-bottom-tabs@5.2.7...@react-navigation/material-bottom-tabs@5.2.8) (2020-05-23)
|
||||||
|
|
||||||
**Note:** Version bump only for package @react-navigation/material-bottom-tabs
|
**Note:** Version bump only for package @react-navigation/material-bottom-tabs
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "@react-navigation/material-bottom-tabs",
|
"name": "@react-navigation/material-bottom-tabs",
|
||||||
"description": "Integration for bottom navigation component from react-native-paper",
|
"description": "Integration for bottom navigation component from react-native-paper",
|
||||||
"version": "5.2.8",
|
"version": "5.2.9",
|
||||||
"keywords": [
|
"keywords": [
|
||||||
"react-native-component",
|
"react-native-component",
|
||||||
"react-component",
|
"react-component",
|
||||||
@@ -38,7 +38,7 @@
|
|||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@react-native-community/bob": "^0.14.3",
|
"@react-native-community/bob": "^0.14.3",
|
||||||
"@react-navigation/native": "^5.4.3",
|
"@react-navigation/native": "^5.5.0",
|
||||||
"@types/react": "^16.9.34",
|
"@types/react": "^16.9.34",
|
||||||
"@types/react-native": "^0.62.7",
|
"@types/react-native": "^0.62.7",
|
||||||
"@types/react-native-vector-icons": "^6.4.5",
|
"@types/react-native-vector-icons": "^6.4.5",
|
||||||
|
|||||||
@@ -3,6 +3,14 @@
|
|||||||
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.2.9](https://github.com/react-navigation/react-navigation/tree/master/packages/material-top-tabs/compare/@react-navigation/material-top-tabs@5.2.8...@react-navigation/material-top-tabs@5.2.9) (2020-05-27)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @react-navigation/material-top-tabs
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## [5.2.8](https://github.com/react-navigation/react-navigation/tree/master/packages/material-top-tabs/compare/@react-navigation/material-top-tabs@5.2.7...@react-navigation/material-top-tabs@5.2.8) (2020-05-23)
|
## [5.2.8](https://github.com/react-navigation/react-navigation/tree/master/packages/material-top-tabs/compare/@react-navigation/material-top-tabs@5.2.7...@react-navigation/material-top-tabs@5.2.8) (2020-05-23)
|
||||||
|
|
||||||
**Note:** Version bump only for package @react-navigation/material-top-tabs
|
**Note:** Version bump only for package @react-navigation/material-top-tabs
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "@react-navigation/material-top-tabs",
|
"name": "@react-navigation/material-top-tabs",
|
||||||
"description": "Integration for the animated tab view component from react-native-tab-view",
|
"description": "Integration for the animated tab view component from react-native-tab-view",
|
||||||
"version": "5.2.8",
|
"version": "5.2.9",
|
||||||
"keywords": [
|
"keywords": [
|
||||||
"react-native-component",
|
"react-native-component",
|
||||||
"react-component",
|
"react-component",
|
||||||
@@ -41,7 +41,7 @@
|
|||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@react-native-community/bob": "^0.14.3",
|
"@react-native-community/bob": "^0.14.3",
|
||||||
"@react-navigation/native": "^5.4.3",
|
"@react-navigation/native": "^5.5.0",
|
||||||
"@types/react": "^16.9.34",
|
"@types/react": "^16.9.34",
|
||||||
"@types/react-native": "^0.62.7",
|
"@types/react-native": "^0.62.7",
|
||||||
"del-cli": "^3.0.0",
|
"del-cli": "^3.0.0",
|
||||||
|
|||||||
@@ -3,6 +3,23 @@
|
|||||||
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.5.0](https://github.com/react-navigation/react-navigation/tree/master/packages/native/compare/@react-navigation/native@5.4.3...@react-navigation/native@5.5.0) (2020-05-27)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* export types from /native ([af1722d](https://github.com/react-navigation/react-navigation/tree/master/packages/native/commit/af1722d1e915f3ec234df202f74c4b4c631472c7))
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* add a `ServerContainer` component for SSR ([#8297](https://github.com/react-navigation/react-navigation/tree/master/packages/native/issues/8297)) ([68e750d](https://github.com/react-navigation/react-navigation/tree/master/packages/native/commit/68e750d5a6d198a2f5bdb86ba631de0a27732943))
|
||||||
|
* add ref to get current options in `ServerContainer` ([#8333](https://github.com/react-navigation/react-navigation/tree/master/packages/native/issues/8333)) ([0b1a718](https://github.com/react-navigation/react-navigation/tree/master/packages/native/commit/0b1a718756e208d84b20e45ca56004332308ad54))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## [5.4.3](https://github.com/react-navigation/react-navigation/tree/master/packages/native/compare/@react-navigation/native@5.4.2...@react-navigation/native@5.4.3) (2020-05-23)
|
## [5.4.3](https://github.com/react-navigation/react-navigation/tree/master/packages/native/compare/@react-navigation/native@5.4.2...@react-navigation/native@5.4.3) (2020-05-23)
|
||||||
|
|
||||||
**Note:** Version bump only for package @react-navigation/native
|
**Note:** Version bump only for package @react-navigation/native
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "@react-navigation/native",
|
"name": "@react-navigation/native",
|
||||||
"description": "React Native integration for React Navigation",
|
"description": "React Native integration for React Navigation",
|
||||||
"version": "5.4.3",
|
"version": "5.5.0",
|
||||||
"keywords": [
|
"keywords": [
|
||||||
"react-native",
|
"react-native",
|
||||||
"react-navigation",
|
"react-navigation",
|
||||||
@@ -33,14 +33,16 @@
|
|||||||
"clean": "del lib"
|
"clean": "del lib"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@react-navigation/core": "^5.8.2"
|
"@react-navigation/core": "^5.9.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@react-native-community/bob": "^0.14.3",
|
"@react-native-community/bob": "^0.14.3",
|
||||||
"@types/react": "^16.9.34",
|
"@types/react": "^16.9.34",
|
||||||
|
"@types/react-dom": "^16.9.8",
|
||||||
"@types/react-native": "^0.62.7",
|
"@types/react-native": "^0.62.7",
|
||||||
"del-cli": "^3.0.0",
|
"del-cli": "^3.0.0",
|
||||||
"react": "~16.9.0",
|
"react": "~16.9.0",
|
||||||
|
"react-dom": "^16.13.1",
|
||||||
"react-native": "~0.61.5",
|
"react-native": "~0.61.5",
|
||||||
"react-native-testing-library": "^1.13.2",
|
"react-native-testing-library": "^1.13.2",
|
||||||
"typescript": "^3.8.3"
|
"typescript": "^3.8.3"
|
||||||
|
|||||||
55
packages/native/src/ServerContainer.tsx
Normal file
55
packages/native/src/ServerContainer.tsx
Normal file
@@ -0,0 +1,55 @@
|
|||||||
|
import * as React from 'react';
|
||||||
|
import { CurrentRenderContext } from '@react-navigation/core';
|
||||||
|
import ServerContext, { ServerContextType } from './ServerContext';
|
||||||
|
import { ServerContainerRef } from './types';
|
||||||
|
|
||||||
|
type Props = ServerContextType & {
|
||||||
|
children: React.ReactNode;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Container component for server rendering.
|
||||||
|
*
|
||||||
|
* @param props.location Location object to base the initial URL for SSR.
|
||||||
|
* @param props.children Child elements to render the content.
|
||||||
|
* @param props.ref Ref object which contains helper methods.
|
||||||
|
*/
|
||||||
|
export default React.forwardRef(function ServerContainer(
|
||||||
|
{ children, location }: Props,
|
||||||
|
ref: React.Ref<ServerContainerRef>
|
||||||
|
) {
|
||||||
|
React.useEffect(() => {
|
||||||
|
console.error(
|
||||||
|
"'ServerContainer' should only be used on the server with 'react-dom/server' for SSR."
|
||||||
|
);
|
||||||
|
}, []);
|
||||||
|
|
||||||
|
const current: { options?: object } = {};
|
||||||
|
|
||||||
|
if (ref) {
|
||||||
|
const value = {
|
||||||
|
getCurrentOptions() {
|
||||||
|
return current.options;
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
// We write to the `ref` during render instead of `React.useImperativeHandle`
|
||||||
|
// This is because `useImperativeHandle` will update the ref after 'commit',
|
||||||
|
// and there's no 'commit' phase during SSR.
|
||||||
|
// Mutating ref during render is unsafe in concurrent mode, but we don't care about it for SSR.
|
||||||
|
if (typeof ref === 'function') {
|
||||||
|
ref(value);
|
||||||
|
} else {
|
||||||
|
// @ts-ignore: the TS types are incorrect and say that ref.current is readonly
|
||||||
|
ref.current = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
<ServerContext.Provider value={{ location }}>
|
||||||
|
<CurrentRenderContext.Provider value={current}>
|
||||||
|
{children}
|
||||||
|
</CurrentRenderContext.Provider>
|
||||||
|
</ServerContext.Provider>
|
||||||
|
);
|
||||||
|
});
|
||||||
14
packages/native/src/ServerContext.tsx
Normal file
14
packages/native/src/ServerContext.tsx
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
import * as React from 'react';
|
||||||
|
|
||||||
|
export type ServerContextType = {
|
||||||
|
location?: {
|
||||||
|
pathname: string;
|
||||||
|
search: string;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
const ServerContext = React.createContext<ServerContextType | undefined>(
|
||||||
|
undefined
|
||||||
|
);
|
||||||
|
|
||||||
|
export default ServerContext;
|
||||||
185
packages/native/src/__tests__/ServerContainer.test.tsx
Normal file
185
packages/native/src/__tests__/ServerContainer.test.tsx
Normal file
@@ -0,0 +1,185 @@
|
|||||||
|
import * as React from 'react';
|
||||||
|
import {
|
||||||
|
useNavigationBuilder,
|
||||||
|
createNavigatorFactory,
|
||||||
|
StackRouter,
|
||||||
|
TabRouter,
|
||||||
|
NavigationHelpersContext,
|
||||||
|
} from '@react-navigation/core';
|
||||||
|
import { renderToString } from 'react-dom/server';
|
||||||
|
import NavigationContainer from '../NavigationContainer';
|
||||||
|
import ServerContainer from '../ServerContainer';
|
||||||
|
import { ServerContainerRef } from '../types';
|
||||||
|
|
||||||
|
// @ts-ignore
|
||||||
|
global.window = global;
|
||||||
|
|
||||||
|
window.addEventListener = () => {};
|
||||||
|
window.removeEventListener = () => {};
|
||||||
|
|
||||||
|
// We want to use the web version of useLinking
|
||||||
|
jest.mock('../useLinking', () => require('../useLinking.tsx').default);
|
||||||
|
|
||||||
|
it('renders correct state with location', () => {
|
||||||
|
const createStackNavigator = createNavigatorFactory((props: any) => {
|
||||||
|
const { navigation, state, descriptors } = useNavigationBuilder(
|
||||||
|
StackRouter,
|
||||||
|
props
|
||||||
|
);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<NavigationHelpersContext.Provider value={navigation}>
|
||||||
|
{state.routes.map((route) => (
|
||||||
|
<div key={route.key}>{descriptors[route.key].render()}</div>
|
||||||
|
))}
|
||||||
|
</NavigationHelpersContext.Provider>
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
const Stack = createStackNavigator();
|
||||||
|
|
||||||
|
const TestScreen = ({ route }: any): any =>
|
||||||
|
`${route.name} ${JSON.stringify(route.params)}`;
|
||||||
|
|
||||||
|
const NestedStack = () => {
|
||||||
|
return (
|
||||||
|
<Stack.Navigator initialRouteName="Feed">
|
||||||
|
<Stack.Screen name="Profile" component={TestScreen} />
|
||||||
|
<Stack.Screen name="Settings" component={TestScreen} />
|
||||||
|
<Stack.Screen name="Feed" component={TestScreen} />
|
||||||
|
<Stack.Screen name="Updates" component={TestScreen} />
|
||||||
|
</Stack.Navigator>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
const element = (
|
||||||
|
<NavigationContainer
|
||||||
|
linking={{
|
||||||
|
prefixes: [],
|
||||||
|
config: {
|
||||||
|
Home: {
|
||||||
|
initialRouteName: 'Profile',
|
||||||
|
screens: {
|
||||||
|
Settings: {
|
||||||
|
path: ':user/edit',
|
||||||
|
},
|
||||||
|
Updates: {
|
||||||
|
path: ':user/updates',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<Stack.Navigator>
|
||||||
|
<Stack.Screen name="Home" component={NestedStack} />
|
||||||
|
<Stack.Screen name="Chat" component={TestScreen} />
|
||||||
|
</Stack.Navigator>
|
||||||
|
</NavigationContainer>
|
||||||
|
);
|
||||||
|
|
||||||
|
// @ts-ignore
|
||||||
|
window.location = { pathname: '/jane/edit', search: '' };
|
||||||
|
|
||||||
|
const client = renderToString(element);
|
||||||
|
|
||||||
|
expect(client).toMatchInlineSnapshot(
|
||||||
|
`"<div><div>Profile undefined</div><div>Settings {"user":"jane"}</div></div>"`
|
||||||
|
);
|
||||||
|
|
||||||
|
const server = renderToString(
|
||||||
|
<ServerContainer location={{ pathname: '/john/updates', search: '' }}>
|
||||||
|
{element}
|
||||||
|
</ServerContainer>
|
||||||
|
);
|
||||||
|
|
||||||
|
expect(server).toMatchInlineSnapshot(
|
||||||
|
`"<div><div>Profile undefined</div><div>Updates {"user":"john"}</div></div>"`
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('gets the current options', () => {
|
||||||
|
const createTabNavigator = createNavigatorFactory((props: any) => {
|
||||||
|
const { navigation, state, descriptors } = useNavigationBuilder(
|
||||||
|
TabRouter,
|
||||||
|
props
|
||||||
|
);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<NavigationHelpersContext.Provider value={navigation}>
|
||||||
|
{state.routes.map((route) => (
|
||||||
|
<div key={route.key}>{descriptors[route.key].render()}</div>
|
||||||
|
))}
|
||||||
|
</NavigationHelpersContext.Provider>
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
const Tab = createTabNavigator();
|
||||||
|
|
||||||
|
const TestScreen = ({ route }: any): any =>
|
||||||
|
`${route.name} ${JSON.stringify(route.params)}`;
|
||||||
|
|
||||||
|
const NestedStack = () => {
|
||||||
|
return (
|
||||||
|
<Tab.Navigator initialRouteName="Feed">
|
||||||
|
<Tab.Screen
|
||||||
|
name="Profile"
|
||||||
|
component={TestScreen}
|
||||||
|
options={{ title: 'My profile' }}
|
||||||
|
/>
|
||||||
|
<Tab.Screen
|
||||||
|
name="Settings"
|
||||||
|
component={TestScreen}
|
||||||
|
options={{ title: 'Configure' }}
|
||||||
|
/>
|
||||||
|
<Tab.Screen
|
||||||
|
name="Feed"
|
||||||
|
component={TestScreen}
|
||||||
|
options={{ title: 'News feed' }}
|
||||||
|
/>
|
||||||
|
<Tab.Screen
|
||||||
|
name="Updates"
|
||||||
|
component={TestScreen}
|
||||||
|
options={{ title: 'Updates from cloud', description: 'Woah' }}
|
||||||
|
/>
|
||||||
|
</Tab.Navigator>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
const ref = React.createRef<ServerContainerRef>();
|
||||||
|
|
||||||
|
renderToString(
|
||||||
|
<ServerContainer ref={ref}>
|
||||||
|
<NavigationContainer
|
||||||
|
initialState={{
|
||||||
|
routes: [
|
||||||
|
{
|
||||||
|
name: 'Others',
|
||||||
|
state: {
|
||||||
|
routes: [{ name: 'Updates' }],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<Tab.Navigator>
|
||||||
|
<Tab.Screen
|
||||||
|
name="Home"
|
||||||
|
component={TestScreen}
|
||||||
|
options={{ title: 'My app' }}
|
||||||
|
/>
|
||||||
|
<Tab.Screen
|
||||||
|
name="Others"
|
||||||
|
component={NestedStack}
|
||||||
|
options={{ title: 'Other stuff' }}
|
||||||
|
/>
|
||||||
|
</Tab.Navigator>
|
||||||
|
</NavigationContainer>
|
||||||
|
</ServerContainer>
|
||||||
|
);
|
||||||
|
|
||||||
|
expect(ref.current?.getCurrentOptions()).toEqual({
|
||||||
|
title: 'Updates from cloud',
|
||||||
|
description: 'Woah',
|
||||||
|
});
|
||||||
|
});
|
||||||
@@ -15,3 +15,7 @@ export { default as useLinking } from './useLinking';
|
|||||||
export { default as useLinkTo } from './useLinkTo';
|
export { default as useLinkTo } from './useLinkTo';
|
||||||
export { default as useLinkProps } from './useLinkProps';
|
export { default as useLinkProps } from './useLinkProps';
|
||||||
export { default as useLinkBuilder } from './useLinkBuilder';
|
export { default as useLinkBuilder } from './useLinkBuilder';
|
||||||
|
|
||||||
|
export { default as ServerContainer } from './ServerContainer';
|
||||||
|
|
||||||
|
export * from './types';
|
||||||
|
|||||||
@@ -51,3 +51,7 @@ export type LinkingOptions = {
|
|||||||
*/
|
*/
|
||||||
getPathFromState?: typeof getPathFromStateDefault;
|
getPathFromState?: typeof getPathFromStateDefault;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export type ServerContainerRef = {
|
||||||
|
getCurrentOptions(): Record<string, any> | undefined;
|
||||||
|
};
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import {
|
|||||||
NavigationState,
|
NavigationState,
|
||||||
getActionFromState,
|
getActionFromState,
|
||||||
} from '@react-navigation/core';
|
} from '@react-navigation/core';
|
||||||
|
import ServerContext from './ServerContext';
|
||||||
import { LinkingOptions } from './types';
|
import { LinkingOptions } from './types';
|
||||||
|
|
||||||
type ResultState = ReturnType<typeof getStateFromPathDefault>;
|
type ResultState = ReturnType<typeof getStateFromPathDefault>;
|
||||||
@@ -84,11 +85,17 @@ export default function useLinking(
|
|||||||
getPathFromStateRef.current = getPathFromState;
|
getPathFromStateRef.current = getPathFromState;
|
||||||
}, [config, enabled, getPathFromState, getStateFromPath]);
|
}, [config, enabled, getPathFromState, getStateFromPath]);
|
||||||
|
|
||||||
|
const server = React.useContext(ServerContext);
|
||||||
|
|
||||||
const getInitialState = React.useCallback(() => {
|
const getInitialState = React.useCallback(() => {
|
||||||
let value: ResultState | undefined;
|
let value: ResultState | undefined;
|
||||||
|
|
||||||
if (enabledRef.current) {
|
if (enabledRef.current) {
|
||||||
const path = location.pathname + location.search;
|
const location =
|
||||||
|
server?.location ??
|
||||||
|
(typeof window !== 'undefined' ? window.location : undefined);
|
||||||
|
|
||||||
|
const path = location ? location.pathname + location.search : undefined;
|
||||||
|
|
||||||
if (path) {
|
if (path) {
|
||||||
value = getStateFromPathRef.current(path, configRef.current);
|
value = getStateFromPathRef.current(path, configRef.current);
|
||||||
@@ -106,6 +113,7 @@ export default function useLinking(
|
|||||||
};
|
};
|
||||||
|
|
||||||
return thenable as PromiseLike<ResultState | undefined>;
|
return thenable as PromiseLike<ResultState | undefined>;
|
||||||
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
const previousStateLengthRef = React.useRef<number | undefined>(undefined);
|
const previousStateLengthRef = React.useRef<number | undefined>(undefined);
|
||||||
|
|||||||
@@ -3,6 +3,18 @@
|
|||||||
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.4.1](https://github.com/react-navigation/react-navigation/tree/master/packages/stack/compare/@react-navigation/stack@5.4.0...@react-navigation/stack@5.4.1) (2020-05-27)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* allow HeaderBackground's subViews to be touchable ([#8317](https://github.com/react-navigation/react-navigation/tree/master/packages/stack/issues/8317)) ([00c23f2](https://github.com/react-navigation/react-navigation/tree/master/packages/stack/commit/00c23f2c9ed22fa4d010ffb427f2b52e061d8df4))
|
||||||
|
* fix type of style for various options ([9d822b9](https://github.com/react-navigation/react-navigation/tree/master/packages/stack/commit/9d822b95a6df797e2e63e481573e64ea7d0f9386))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# [5.4.0](https://github.com/react-navigation/react-navigation/tree/master/packages/stack/compare/@react-navigation/stack@5.3.9...@react-navigation/stack@5.4.0) (2020-05-23)
|
# [5.4.0](https://github.com/react-navigation/react-navigation/tree/master/packages/stack/compare/@react-navigation/stack@5.3.9...@react-navigation/stack@5.4.0) (2020-05-23)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "@react-navigation/stack",
|
"name": "@react-navigation/stack",
|
||||||
"description": "Stack navigator component for iOS and Android with animated transitions and gestures",
|
"description": "Stack navigator component for iOS and Android with animated transitions and gestures",
|
||||||
"version": "5.4.0",
|
"version": "5.4.1",
|
||||||
"keywords": [
|
"keywords": [
|
||||||
"react-native-component",
|
"react-native-component",
|
||||||
"react-component",
|
"react-component",
|
||||||
@@ -42,7 +42,7 @@
|
|||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@react-native-community/bob": "^0.14.3",
|
"@react-native-community/bob": "^0.14.3",
|
||||||
"@react-native-community/masked-view": "^0.1.10",
|
"@react-native-community/masked-view": "^0.1.10",
|
||||||
"@react-navigation/native": "^5.4.3",
|
"@react-navigation/native": "^5.5.0",
|
||||||
"@types/color": "^3.0.1",
|
"@types/color": "^3.0.1",
|
||||||
"@types/react": "^16.9.34",
|
"@types/react": "^16.9.34",
|
||||||
"@types/react-native": "^0.62.7",
|
"@types/react-native": "^0.62.7",
|
||||||
|
|||||||
@@ -119,7 +119,7 @@ export type StackHeaderOptions = {
|
|||||||
* This may lead to white space or overlap between `headerLeft` and `headerTitle` if a customized `headerLeft` is used.
|
* This may lead to white space or overlap between `headerLeft` and `headerTitle` if a customized `headerLeft` is used.
|
||||||
* It can be solved by adjusting `left` and `right` style in `headerTitleContainerStyle` and `marginHorizontal` in `headerTitleStyle`.
|
* It can be solved by adjusting `left` and `right` style in `headerTitleContainerStyle` and `marginHorizontal` in `headerTitleStyle`.
|
||||||
*/
|
*/
|
||||||
headerTitleContainerStyle?: StyleProp<ViewStyle>;
|
headerTitleContainerStyle?: Animated.WithAnimatedValue<StyleProp<ViewStyle>>;
|
||||||
/**
|
/**
|
||||||
* Tint color for the header.
|
* Tint color for the header.
|
||||||
*/
|
*/
|
||||||
@@ -157,7 +157,7 @@ export type StackHeaderOptions = {
|
|||||||
/**
|
/**
|
||||||
* Style object for the container of the `headerLeft` component, for example to add padding.
|
* Style object for the container of the `headerLeft` component, for example to add padding.
|
||||||
*/
|
*/
|
||||||
headerLeftContainerStyle?: StyleProp<ViewStyle>;
|
headerLeftContainerStyle?: Animated.WithAnimatedValue<StyleProp<ViewStyle>>;
|
||||||
/**
|
/**
|
||||||
* Function which returns a React Element to display on the right side of the header.
|
* Function which returns a React Element to display on the right side of the header.
|
||||||
*/
|
*/
|
||||||
@@ -165,7 +165,7 @@ export type StackHeaderOptions = {
|
|||||||
/**
|
/**
|
||||||
* Style object for the container of the `headerRight` component, for example to add padding.
|
* Style object for the container of the `headerRight` component, for example to add padding.
|
||||||
*/
|
*/
|
||||||
headerRightContainerStyle?: StyleProp<ViewStyle>;
|
headerRightContainerStyle?: Animated.WithAnimatedValue<StyleProp<ViewStyle>>;
|
||||||
/**
|
/**
|
||||||
* Function which returns a React Element to display custom image in header's back button.
|
* Function which returns a React Element to display custom image in header's back button.
|
||||||
* It receives the `tintColor` in in the options object as an argument. object.
|
* It receives the `tintColor` in in the options object as an argument. object.
|
||||||
@@ -187,7 +187,7 @@ export type StackHeaderOptions = {
|
|||||||
/**
|
/**
|
||||||
* Style object for the header. You can specify a custom background color here, for example.
|
* Style object for the header. You can specify a custom background color here, for example.
|
||||||
*/
|
*/
|
||||||
headerStyle?: StyleProp<ViewStyle>;
|
headerStyle?: Animated.WithAnimatedValue<StyleProp<ViewStyle>>;
|
||||||
/**
|
/**
|
||||||
* Defaults to `false`. If `true`, the header will not have a background unless you explicitly provide it with `headerBackground`.
|
* Defaults to `false`. If `true`, the header will not have a background unless you explicitly provide it with `headerBackground`.
|
||||||
* The header will also float over the screen so that it overlaps the content underneath.
|
* The header will also float over the screen so that it overlaps the content underneath.
|
||||||
@@ -380,7 +380,7 @@ export type StackHeaderLeftButtonProps = {
|
|||||||
/**
|
/**
|
||||||
* Style object for the label.
|
* Style object for the label.
|
||||||
*/
|
*/
|
||||||
labelStyle?: React.ComponentProps<typeof Animated.Text>['style'];
|
labelStyle?: Animated.WithAnimatedValue<StyleProp<TextStyle>>;
|
||||||
/**
|
/**
|
||||||
* Whether label font should scale to respect Text Size accessibility settings.
|
* Whether label font should scale to respect Text Size accessibility settings.
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -1,8 +1,16 @@
|
|||||||
import * as React from 'react';
|
import * as React from 'react';
|
||||||
import { Animated, StyleSheet, Platform, ViewProps } from 'react-native';
|
import {
|
||||||
|
Animated,
|
||||||
|
StyleSheet,
|
||||||
|
Platform,
|
||||||
|
ViewProps,
|
||||||
|
StyleProp,
|
||||||
|
ViewStyle,
|
||||||
|
} from 'react-native';
|
||||||
import { useTheme } from '@react-navigation/native';
|
import { useTheme } from '@react-navigation/native';
|
||||||
|
|
||||||
type Props = ViewProps & {
|
type Props = ViewProps & {
|
||||||
|
style?: Animated.WithAnimatedValue<StyleProp<ViewStyle>>;
|
||||||
children?: React.ReactNode;
|
children?: React.ReactNode;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -312,8 +312,8 @@ export default class HeaderSegment extends React.Component<Props, State> {
|
|||||||
return (
|
return (
|
||||||
<React.Fragment>
|
<React.Fragment>
|
||||||
<Animated.View
|
<Animated.View
|
||||||
pointerEvents="none"
|
pointerEvents="box-none"
|
||||||
style={[StyleSheet.absoluteFill, backgroundStyle]}
|
style={[StyleSheet.absoluteFill, { zIndex: 0 }, backgroundStyle]}
|
||||||
>
|
>
|
||||||
{headerBackground ? (
|
{headerBackground ? (
|
||||||
headerBackground({ style: safeStyles })
|
headerBackground({ style: safeStyles })
|
||||||
|
|||||||
@@ -46,7 +46,9 @@ type Props = ViewProps & {
|
|||||||
onGestureCanceled?: () => void;
|
onGestureCanceled?: () => void;
|
||||||
onGestureEnd?: () => void;
|
onGestureEnd?: () => void;
|
||||||
children: React.ReactNode;
|
children: React.ReactNode;
|
||||||
overlay: (props: { style: StyleProp<ViewStyle> }) => React.ReactNode;
|
overlay: (props: {
|
||||||
|
style: Animated.WithAnimatedValue<StyleProp<ViewStyle>>;
|
||||||
|
}) => React.ReactNode;
|
||||||
overlayEnabled: boolean;
|
overlayEnabled: boolean;
|
||||||
shadowEnabled: boolean;
|
shadowEnabled: boolean;
|
||||||
gestureEnabled: boolean;
|
gestureEnabled: boolean;
|
||||||
@@ -83,7 +85,11 @@ export default class Card extends React.Component<Props> {
|
|||||||
shadowEnabled: true,
|
shadowEnabled: true,
|
||||||
gestureEnabled: true,
|
gestureEnabled: true,
|
||||||
gestureVelocityImpact: GESTURE_VELOCITY_IMPACT,
|
gestureVelocityImpact: GESTURE_VELOCITY_IMPACT,
|
||||||
overlay: ({ style }: { style: StyleProp<ViewStyle> }) =>
|
overlay: ({
|
||||||
|
style,
|
||||||
|
}: {
|
||||||
|
style: Animated.WithAnimatedValue<StyleProp<ViewStyle>>;
|
||||||
|
}) =>
|
||||||
style ? (
|
style ? (
|
||||||
<Animated.View pointerEvents="none" style={[styles.overlay, style]} />
|
<Animated.View pointerEvents="none" style={[styles.overlay, style]} />
|
||||||
) : null,
|
) : null,
|
||||||
|
|||||||
@@ -83,9 +83,10 @@ const getHeaderHeights = (
|
|||||||
) => {
|
) => {
|
||||||
return routes.reduce<Record<string, number>>((acc, curr) => {
|
return routes.reduce<Record<string, number>>((acc, curr) => {
|
||||||
const { options = {} } = descriptors[curr.key] || {};
|
const { options = {} } = descriptors[curr.key] || {};
|
||||||
const { height = previous[curr.key] } = StyleSheet.flatten(
|
const style: any = StyleSheet.flatten(options.headerStyle || {});
|
||||||
options.headerStyle || {}
|
|
||||||
);
|
const height =
|
||||||
|
typeof style.height === 'number' ? style.height : previous[curr.key];
|
||||||
|
|
||||||
const safeAreaInsets = {
|
const safeAreaInsets = {
|
||||||
...insets,
|
...insets,
|
||||||
|
|||||||
Reference in New Issue
Block a user