diff --git a/configs/.flowconfig b/configs/.flowconfig index e2348f7f51..303c45a0fb 100644 --- a/configs/.flowconfig +++ b/configs/.flowconfig @@ -6,11 +6,14 @@ /packages/.*/dist/.* /packages/react-native-web-docs/.* /packages/react-native-web-examples/.* -.*/node_modules/.*/.*.json [include] +[declarations] +.*/node_modules/.* + [libs] [options] +indexed_access=true munge_underscores=true diff --git a/package-lock.json b/package-lock.json index 4af96be556..940ed28239 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11179,6 +11179,11 @@ "dev": true, "license": "MIT" }, + "node_modules/memoize-one": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz", + "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==" + }, "node_modules/memorystream": { "version": "0.3.1", "dev": true, @@ -11736,6 +11741,11 @@ "url": "https://github.com/fb55/nth-check?sponsor=1" } }, + "node_modules/nullthrows": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/nullthrows/-/nullthrows-1.1.1.tgz", + "integrity": "sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==" + }, "node_modules/nunjucks": { "version": "3.2.3", "dev": true, @@ -15410,7 +15420,7 @@ } }, "packages/babel-plugin-react-native-web": { - "version": "0.19.1", + "version": "0.19.4", "license": "MIT", "devDependencies": { "babel-plugin-tester": "^10.1.0" @@ -15466,13 +15476,15 @@ "license": "MIT" }, "packages/react-native-web": { - "version": "0.19.1", + "version": "0.19.4", "license": "MIT", "dependencies": { "@babel/runtime": "^7.18.6", "fbjs": "^3.0.4", "inline-style-prefixer": "^6.0.1", + "memoize-one": "^6.0.0", "normalize-css-color": "^1.0.2", + "nullthrows": "^1.1.1", "postcss-value-parser": "^4.2.0", "styleq": "^0.1.2" }, @@ -15482,7 +15494,7 @@ } }, "packages/react-native-web-docs": { - "version": "0.19.1", + "version": "0.19.4", "devDependencies": { "@11ty/eleventy": "^1.0.1", "@11ty/eleventy-navigation": "^0.3.3", @@ -15503,14 +15515,14 @@ } }, "packages/react-native-web-examples": { - "version": "0.19.1", + "version": "0.19.4", "license": "MIT", "dependencies": { - "babel-plugin-react-native-web": "0.19.1", + "babel-plugin-react-native-web": "0.19.4", "next": "^12.2.0", "react": "^18.0.0", "react-dom": "^18.0.0", - "react-native-web": "0.19.1" + "react-native-web": "0.19.4" }, "devDependencies": { "@babel/core": "^7.18.6", @@ -22680,6 +22692,11 @@ "version": "1.0.1", "dev": true }, + "memoize-one": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz", + "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==" + }, "memorystream": { "version": "0.3.1", "dev": true @@ -23016,6 +23033,11 @@ "boolbase": "^1.0.0" } }, + "nullthrows": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/nullthrows/-/nullthrows-1.1.1.tgz", + "integrity": "sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==" + }, "nunjucks": { "version": "3.2.3", "dev": true, @@ -23607,7 +23629,9 @@ "@babel/runtime": "^7.18.6", "fbjs": "^3.0.4", "inline-style-prefixer": "^6.0.1", + "memoize-one": "^6.0.0", "normalize-css-color": "^1.0.2", + "nullthrows": "^1.1.1", "postcss-value-parser": "^4.2.0", "styleq": "^0.1.2" } @@ -23638,11 +23662,11 @@ "requires": { "@babel/core": "^7.18.6", "@babel/preset-flow": "^7.18.6", - "babel-plugin-react-native-web": "0.19.1", + "babel-plugin-react-native-web": "0.19.4", "next": "^12.2.0", "react": "^18.0.0", "react-dom": "^18.0.0", - "react-native-web": "0.19.1" + "react-native-web": "0.19.4" } }, "read-pkg": { diff --git a/packages/babel-plugin-react-native-web/package.json b/packages/babel-plugin-react-native-web/package.json index b868e47745..a884780b55 100644 --- a/packages/babel-plugin-react-native-web/package.json +++ b/packages/babel-plugin-react-native-web/package.json @@ -3,7 +3,7 @@ "registry": "https://registry.npmjs.org/" }, "name": "babel-plugin-react-native-web", - "version": "0.19.1", + "version": "0.19.4", "description": "Babel plugin for React Native for Web", "main": "index.js", "devDependencies": { diff --git a/packages/babel-plugin-react-native-web/src/moduleMap.js b/packages/babel-plugin-react-native-web/src/moduleMap.js index ad701cf822..a83dd77e1d 100644 --- a/packages/babel-plugin-react-native-web/src/moduleMap.js +++ b/packages/babel-plugin-react-native-web/src/moduleMap.js @@ -7,6 +7,7 @@ module.exports = { AppRegistry: true, AppState: true, Appearance: true, + BackHandler: true, Button: true, CheckBox: true, Clipboard: true, diff --git a/packages/react-native-web-docs/package.json b/packages/react-native-web-docs/package.json index 2f0a5e029c..962956654a 100644 --- a/packages/react-native-web-docs/package.json +++ b/packages/react-native-web-docs/package.json @@ -1,7 +1,7 @@ { "private": true, "name": "react-native-web-docs", - "version": "0.19.1", + "version": "0.19.4", "description": "Documentation website for React Native for Web", "scripts": { "dev": "eleventy --serve", diff --git a/packages/react-native-web-examples/next.config.js b/packages/react-native-web-examples/next.config.js index 7fcc182978..ee1c14d7f1 100644 --- a/packages/react-native-web-examples/next.config.js +++ b/packages/react-native-web-examples/next.config.js @@ -7,6 +7,9 @@ const pages = fs .map((dirent) => dirent.name); module.exports = { - outDir: 'dist', - env: { pages } + env: { pages }, + webpack: (config, options) => { + config.resolve.alias['react-native'] = 'react-native-web'; + return config; + } }; diff --git a/packages/react-native-web-examples/package.json b/packages/react-native-web-examples/package.json index b5e21299f3..b3e73b752b 100644 --- a/packages/react-native-web-examples/package.json +++ b/packages/react-native-web-examples/package.json @@ -1,18 +1,18 @@ { "private": true, "name": "react-native-web-examples", - "version": "0.19.1", + "version": "0.19.4", "scripts": { "build": "next build", "dev": "next", "start": "next start" }, "dependencies": { - "babel-plugin-react-native-web": "0.19.1", + "babel-plugin-react-native-web": "0.19.4", "next": "^12.2.0", "react": "^18.0.0", "react-dom": "^18.0.0", - "react-native-web": "0.19.1" + "react-native-web": "0.19.4" }, "devDependencies": { "@babel/core": "^7.18.6", diff --git a/packages/react-native-web-examples/pages/checkbox/index.js b/packages/react-native-web-examples/pages/checkbox/index.js index d7965cee0c..a987af006f 100644 --- a/packages/react-native-web-examples/pages/checkbox/index.js +++ b/packages/react-native-web-examples/pages/checkbox/index.js @@ -25,7 +25,7 @@ export default function CheckboxPage() { - + diff --git a/packages/react-native-web-examples/pages/clipboard/index.js b/packages/react-native-web-examples/pages/clipboard/index.js index d2f19a265d..6fefd315f6 100644 --- a/packages/react-native-web-examples/pages/clipboard/index.js +++ b/packages/react-native-web-examples/pages/clipboard/index.js @@ -1,5 +1,6 @@ -import { Button, Clipboard, StyleSheet, TextInput, View } from 'react-native'; +import { Clipboard, StyleSheet, TextInput, View } from 'react-native'; import React from 'react'; +import Button from '../../shared/button'; import Example from '../../shared/example'; export default function ClipboardPage() { diff --git a/packages/react-native-web-examples/pages/image/index.js b/packages/react-native-web-examples/pages/image/index.js index 7d95ae1b76..623f46c77a 100644 --- a/packages/react-native-web-examples/pages/image/index.js +++ b/packages/react-native-web-examples/pages/image/index.js @@ -59,7 +59,11 @@ export default function ImagePage() { Static image - + Progressive JPEG @@ -166,8 +170,7 @@ const styles = StyleSheet.create({ borderColor: 'black', borderWidth: 0.5, height: 120, - width: 120, - resizeMode: 'cover' + width: 120 }, resizeMode: { borderColor: 'black', diff --git a/packages/react-native-web-examples/pages/index.js b/packages/react-native-web-examples/pages/index.js index 011dda4f33..f78dd8a304 100644 --- a/packages/react-native-web-examples/pages/index.js +++ b/packages/react-native-web-examples/pages/index.js @@ -8,11 +8,7 @@ const logoUri = function Link(props) { return ( - + ); } @@ -22,7 +18,7 @@ export default function IndexPage() { - + {process.env.pages.map((name) => ( - + {name} @@ -77,11 +73,11 @@ const styles = StyleSheet.create({ color: '#1977f2' }, listitem: { - marginVertical: '0.5rem', - textAlign: 'center' + marginVertical: '0.5rem' }, pageLink: { fontSize: '1.25rem', - fontWeight: 'bold' + fontWeight: 'bold', + textAlign: 'center' } }); diff --git a/packages/react-native-web-examples/pages/linking/index.js b/packages/react-native-web-examples/pages/linking/index.js index 125133a5b1..08eff4b5ca 100644 --- a/packages/react-native-web-examples/pages/linking/index.js +++ b/packages/react-native-web-examples/pages/linking/index.js @@ -1,35 +1,48 @@ import { Linking, StyleSheet, Text } from 'react-native'; -import React, { PureComponent } from 'react'; +import React from 'react'; import Example from '../../shared/example'; const url = 'https://mathiasbynens.github.io/rel-noopener/malicious.html'; -export default class LinkingPage extends PureComponent { - handlePress() { +export default function LinkingPage(props) { + const [, setCount] = React.useState(0); + + React.useEffect(() => { + console.log('adding listener'); + const listener = Linking.addEventListener('onOpen', () => { + console.log('onOpen event'); + }); + return () => { + console.log('removing listener'); + listener.remove(); + }; + }); + + function handlePress() { Linking.canOpenURL(url).then((supported) => { - return Linking.openURL(url); + setCount((x) => x + 1); + const v = Linking.openURL(url); + return v; }); } - render() { - return ( - - - Linking.openURL - - - target="_blank" - - - ); - } + return ( + + + Linking.openURL + + + target="_blank" + + + ); } const styles = StyleSheet.create({ diff --git a/packages/react-native-web-examples/pages/lists/index.js b/packages/react-native-web-examples/pages/lists/index.js index bc4407c632..33bc86fa5f 100644 --- a/packages/react-native-web-examples/pages/lists/index.js +++ b/packages/react-native-web-examples/pages/lists/index.js @@ -15,7 +15,7 @@ import { Image, StyleSheet, Switch, - TouchableHighlight, + Pressable, Text, TextInput, View @@ -92,14 +92,11 @@ class ItemComponent extends React.PureComponent<{ const itemHash = Math.abs(hashCode(item.title)); const imgSource = THUMB_URLS[itemHash % THUMB_URLS.length]; return ( - - + ); } } @@ -172,15 +169,11 @@ class Spindicator extends React.PureComponent<{}> { style={[ styles.spindicator, { - transform: [ - { - rotate: this.props.value.interpolate({ - inputRange: [0, 5000], - outputRange: ['0deg', '360deg'], - extrapolate: 'extend' - }) - } - ] + rotate: this.props.value.interpolate({ + inputRange: [0, 5000], + outputRange: ['0deg', '360deg'], + extrapolate: 'extend' + }) } ]} /> @@ -263,9 +256,7 @@ class SingleColumnExample extends React.PureComponent { }; _onChangeScrollToIndex = (text) => { - this._listRef - .getNode() - .scrollToIndex({ viewPosition: 0.5, index: Number(text) }); + this._listRef.scrollToIndex({ viewPosition: 0.5, index: Number(text) }); }; _scrollPos = new Animated.Value(0); @@ -283,7 +274,7 @@ class SingleColumnExample extends React.PureComponent { ); componentDidUpdate() { - this._listRef.getNode().recordInteraction(); // e.g. flipping logViewable switch + this._listRef.recordInteraction(); // e.g. flipping logViewable switch } render() { @@ -398,7 +389,7 @@ class SingleColumnExample extends React.PureComponent { } }; _pressItem = (key: string) => { - this._listRef.getNode().recordInteraction(); + this._listRef.recordInteraction(); pressItem(this, key); }; _listRef: AnimatedFlatList; @@ -469,7 +460,7 @@ const styles = StyleSheet.create({ smallSwitch: { top: 1, margin: -6, - transform: [{ scale: 0.7 }] + transform: 'scale(0.7)' }, stacked: { alignItems: 'center', diff --git a/packages/react-native-web-examples/pages/localization/index.js b/packages/react-native-web-examples/pages/localization/index.js index 5c279066c3..2cc53d6e63 100644 --- a/packages/react-native-web-examples/pages/localization/index.js +++ b/packages/react-native-web-examples/pages/localization/index.js @@ -12,9 +12,9 @@ import React from 'react'; import { - Button, Image, PixelRatio, + Pressable, ScrollView, StyleSheet, Text, @@ -41,7 +41,9 @@ function ListItem(props) { -