-
Notifications
You must be signed in to change notification settings - Fork 1.2k
Fix PickerWindows (and DatePickerExample Page) #4613
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,8 @@ | ||
| { | ||
| "type": "prerelease", | ||
| "comment": "Fix PickerWindows (and DatePickerExample Page)", | ||
| "packageName": "react-native-windows", | ||
| "email": "ngerlem@microsoft.com", | ||
| "dependentChangeType": "patch", | ||
| "date": "2020-04-15T14:30:29.574Z" | ||
| } |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,160 @@ | ||
| /** | ||
| * Copyright (c) Facebook, Inc. and its affiliates. | ||
| * | ||
| * This source code is licensed under the MIT license found in the | ||
| * LICENSE file in the root directory of this source tree. | ||
| * | ||
| * @format | ||
| * @flow | ||
| */ | ||
|
|
||
| 'use strict'; | ||
|
|
||
| const PickerAndroid = require('./PickerAndroid'); | ||
| const PickerIOS = require('./PickerIOS'); | ||
| const PickerWindows = require('./PickerWindows').Picker; // [Windows] | ||
| const Platform = require('../../Utilities/Platform'); | ||
| const React = require('react'); | ||
| const UnimplementedView = require('../UnimplementedViews/UnimplementedView'); | ||
|
|
||
| import type {TextStyleProp} from '../../StyleSheet/StyleSheet'; | ||
| import type {ColorValue} from '../../StyleSheet/StyleSheetTypes'; | ||
|
|
||
| const MODE_DIALOG = 'dialog'; | ||
| const MODE_DROPDOWN = 'dropdown'; | ||
|
|
||
| type PickerItemProps = $ReadOnly<{| | ||
| /** | ||
| * Text to display for this item. | ||
| */ | ||
| label: string, | ||
|
|
||
| /** | ||
| * The value to be passed to picker's `onValueChange` callback when | ||
| * this item is selected. Can be a string or an integer. | ||
| */ | ||
| value?: ?(number | string), | ||
|
|
||
| /** | ||
| * Color of this item's text. | ||
| * @platform android | ||
| */ | ||
| color?: ColorValue, | ||
|
|
||
| /** | ||
| * Used to locate the item in end-to-end tests. | ||
| */ | ||
| testID?: string, | ||
| |}>; | ||
|
|
||
| /** | ||
| * Individual selectable item in a Picker. | ||
| */ | ||
| export type {PickerItem}; | ||
| class PickerItem extends React.Component<PickerItemProps> { | ||
| render() { | ||
| // The items are not rendered directly | ||
| throw null; | ||
| } | ||
| } | ||
|
|
||
| type PickerProps = $ReadOnly<{| | ||
| children?: React.Node, | ||
| style?: ?TextStyleProp, | ||
|
|
||
| /** | ||
| * Value matching value of one of the items. Can be a string or an integer. | ||
| */ | ||
| selectedValue?: ?(number | string), | ||
|
|
||
| /** | ||
| * Callback for when an item is selected. This is called with the following parameters: | ||
| * - `itemValue`: the `value` prop of the item that was selected | ||
| * - `itemIndex`: the index of the selected item in this picker | ||
| */ | ||
| onValueChange?: ?(itemValue: string | number, itemIndex: number) => mixed, | ||
|
|
||
| /** | ||
| * If set to false, the picker will be disabled, i.e. the user will not be able to make a | ||
| * selection. | ||
| * @platform android | ||
| */ | ||
| enabled?: ?boolean, | ||
|
|
||
| /** | ||
| * On Android, specifies how to display the selection items when the user taps on the picker: | ||
| * | ||
| * - 'dialog': Show a modal dialog. This is the default. | ||
| * - 'dropdown': Shows a dropdown anchored to the picker view | ||
| * | ||
| * @platform android | ||
| */ | ||
| mode?: ?('dialog' | 'dropdown'), | ||
|
|
||
| /** | ||
| * Style to apply to each of the item labels. | ||
| * @platform ios | ||
| */ | ||
| itemStyle?: ?TextStyleProp, | ||
|
|
||
| /** | ||
| * Prompt string for this picker, used on Android in dialog mode as the title of the dialog. | ||
| * @platform android | ||
| */ | ||
| prompt?: ?string, | ||
|
|
||
| /** | ||
| * Used to locate this view in end-to-end tests. | ||
| */ | ||
| testID?: ?string, | ||
| |}>; | ||
|
|
||
| /** | ||
| * Renders the native picker component on iOS and Android. Example: | ||
| * | ||
| * <Picker | ||
| * selectedValue={this.state.language} | ||
| * onValueChange={(itemValue, itemIndex) => this.setState({language: itemValue})}> | ||
| * <Picker.Item label="Java" value="java" /> | ||
| * <Picker.Item label="JavaScript" value="js" /> | ||
| * </Picker> | ||
| */ | ||
| class Picker extends React.Component<PickerProps> { | ||
| /** | ||
| * On Android, display the options in a dialog. | ||
| */ | ||
| static MODE_DIALOG: $TEMPORARY$string<'dialog'> = MODE_DIALOG; | ||
|
|
||
| /** | ||
| * On Android, display the options in a dropdown (this is the default). | ||
| */ | ||
| static MODE_DROPDOWN: $TEMPORARY$string<'dropdown'> = MODE_DROPDOWN; | ||
|
|
||
| static Item: typeof PickerItem = PickerItem; | ||
|
|
||
| static defaultProps: {|mode: $TEMPORARY$string<'dialog'>|} = { | ||
| mode: MODE_DIALOG, | ||
| }; | ||
|
|
||
| render(): React.Node { | ||
| if (Platform.OS === 'ios') { | ||
| /* $FlowFixMe(>=0.81.0 site=react_native_ios_fb) This suppression was | ||
| * added when renaming suppression sites. */ | ||
| return <PickerIOS {...this.props}>{this.props.children}</PickerIOS>; | ||
| } else if (Platform.OS === 'android') { | ||
| return ( | ||
| /* $FlowFixMe(>=0.81.0 site=react_native_android_fb) This suppression | ||
| * was added when renaming suppression sites. */ | ||
| <PickerAndroid {...this.props}>{this.props.children}</PickerAndroid> | ||
| ); | ||
| } else if (Platform.OS === 'windows') { | ||
| return ( | ||
| <PickerWindows {...this.props}>{this.props.children}</PickerWindows> // [Windows] | ||
| ); | ||
| } else { | ||
| return <UnimplementedView />; | ||
| } | ||
| } | ||
| } | ||
|
|
||
| module.exports = Picker; | ||
This file was deleted.
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -19,7 +19,7 @@ const RCTPicker = requireNativeComponent< | |
|
|
||
| class PickerItem extends React.Component<IPickerItemProps> { | ||
| public render(): JSX.Element | null { | ||
| return null; | ||
| throw null; | ||
|
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
|
||
| } | ||
| } | ||
|
|
||
|
|
@@ -85,20 +85,19 @@ export class Picker extends React.Component<IPickerProps, State> { | |
| } | ||
|
|
||
| public render(): JSX.Element { | ||
| const props = {...this.props}; | ||
| props.onStartShouldSetResponder = () => true; | ||
| props.onResponderTerminationRequest = () => false; | ||
| props.style = this.props.style; | ||
|
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This line doesn't seem to do anything useful. We already do a shallow clone of props including |
||
| // eslint-disable-next-line @typescript-eslint/no-unused-vars | ||
|
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. There's a setting to disable this check when adjacent to the rest parameter that's off by default, but not in stock RN eslint rules that we're using apparently. I'd be fine changing that as well. |
||
| const {children, ...propsWihoutChildren} = {...this.props}; | ||
| propsWihoutChildren.onStartShouldSetResponder = () => true; | ||
| propsWihoutChildren.onResponderTerminationRequest = () => false; | ||
|
|
||
| return ( | ||
| <RCTPicker | ||
| {...props} | ||
| {...propsWihoutChildren} | ||
| items={this.state.items} | ||
| selectedIndex={this.state.selectedIndex} | ||
| onChange={this._onChange} | ||
| ref={this._setRef}> | ||
| {this.props.children} | ||
| </RCTPicker> | ||
| ref={this._setRef} | ||
| /> | ||
| ); | ||
| } | ||
|
|
||
|
|
||
Uh oh!
There was an error while loading. Please reload this page.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Could we remove it? It seems to bring no value.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
We've been using that to annotate differences in Windows patches. E.g. to ctrl+F for without opening a diff tool.