Files
react-native/packages/rn-tester/js/examples/InvalidProps/InvalidPropsExample.js
Sam Zhou 23c8787fe2 Add annotations to fix future errors after fix for unsound array types (#52691)
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/52691

Unannotated array literals are unsound in Flow right now. This diff adds in annotations and makes a few things readonly, to reduce future errors.

Changelog: [Internal]

Reviewed By: marcoww6

Differential Revision: D78519638

fbshipit-source-id: d98a7668ecf97bcc87dcb3fad25ade736d885d9a
2025-07-17 17:30:43 -07:00

162 lines
4.0 KiB
JavaScript

/**
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
* @flow strict-local
* @format
*/
'use strict';
import type {RNTesterModuleExample} from '../../types/RNTesterTypes';
import RNTesterText from '../../components/RNTesterText';
import * as React from 'react';
import {View} from 'react-native';
export const title = 'Invalid Props';
export const category = 'Other';
export const description =
'Examples of passing invalid prop values and how they fall back to expected defaults.';
export const examples: Array<RNTesterModuleExample> = [
{
title: 'View flex',
render(): React.Node {
return (
<Comparison actual={[1]} expected={undefined}>
{flex => (
<View style={{height: 50}}>
<View
style={
// $FlowFixMe[incompatible-type]
{
flex,
backgroundColor: 'red',
}
}
/>
<View style={{flex: 1, backgroundColor: 'lightgreen'}} />
</View>
)}
</Comparison>
);
},
},
{
title: 'View flexDirection',
render(): React.Node {
return (
<Comparison actual={'row.'} expected={undefined}>
{flexDirection => (
<View
// $FlowFixMe[incompatible-type]
style={{flexDirection}}>
<RNTesterText>⬇️</RNTesterText>
<RNTesterText>⬇️</RNTesterText>
</View>
)}
</Comparison>
);
},
},
{
title: 'Text fontVariant',
render(): React.Node {
return (
<Comparison
actual={['no-such-variant', 'small-caps-12345']}
expected={undefined}>
{fontVariant => (
<RNTesterText
// $FlowFixMe[incompatible-type]
style={{fontVariant}}>
The quick brown fox jumps over the lazy dog.
</RNTesterText>
)}
</Comparison>
);
},
},
{
title: 'View width',
render(): React.Node {
return (
<Comparison actual={['invalid']} expected={undefined}>
{width => (
<View style={{backgroundColor: 'red'}}>
<View
style={
// $FlowFixMe[incompatible-type]
{width, height: 50, backgroundColor: 'lightgreen'}
}
/>
</View>
)}
</Comparison>
);
},
},
{
title: 'View background color',
render(): React.Node {
return (
<Comparison actual={['invalid']} expected={undefined}>
{backgroundColor => (
<View style={{backgroundColor: 'lightgreen'}}>
<View
style={
// $FlowFixMe[incompatible-type]
{backgroundColor, height: 50}
}
/>
</View>
)}
</Comparison>
);
},
},
{
title: 'Malformed platform color',
render(): React.Node {
return (
<Comparison
actual={{resource_paths: ([]: Array<string>)}}
expected={undefined}>
{backgroundColor => (
<View style={{backgroundColor: 'lightgreen'}}>
<View
style={
// $FlowFixMe[incompatible-type]
{backgroundColor, height: 50}
}
/>
</View>
)}
</Comparison>
);
},
},
];
function Comparison<ExpectedT, ActualT>({
children,
actual,
expected,
}: {
children: (value: ExpectedT | ActualT) => React.Node,
actual: ActualT,
expected: ExpectedT,
}): React.Node {
return (
<>
<RNTesterText style={{fontWeight: 'bold'}}>Actual</RNTesterText>
{children(actual)}
<RNTesterText style={{fontWeight: 'bold'}}>Expected</RNTesterText>
{children(expected)}
</>
);
}