forked from microsoft/react-native-windows
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Fix PickerWindows (and DatePickerExample Page)
Fixes microsoft#4597 Our implementation of Picker is a bit deformed. In Stock React Native, Picker.js will delegate to PickerAndroid and PickerIOS. In Windows, we the two are copy pasted. In 0.62, invariants are added to prevent duplicate view manager registration. We run into issues with this with Picker, since our copies will both call requireNativeComponent. This change modifies the normal picker to delegate to PickerWindows to work correctly from the stock picker. I.e. The stock picker's child views are meant for data only and will throw if rendered, where the Windows version's are included but used to noop render. Picker is getting lean-cored, so I didn't invest much into fixing PickerWindow's isssues, converting to Flow, NativeComponent strucutre, etc. Validated Picker, PickerWindows, DatePicker RNTester pages work correctly.
- Loading branch information
1 parent
48eaa21
commit 39e5653
Showing
4 changed files
with
177 additions
and
141 deletions.
There are no files selected for viewing
160 changes: 160 additions & 0 deletions
160
vnext/src/Libraries/Components/Picker/Picker.windows.js
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; |
127 changes: 0 additions & 127 deletions
127
vnext/src/Libraries/Components/Picker/Picker.windows.tsx
This file was deleted.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters