Remove TimePickerAndroid from React Native

Summary: Lean Core

Reviewed By: rubennorte

Differential Revision: D17344045

fbshipit-source-id: a5a7ab41075da93f8a1929059abe183838b00c82
This commit is contained in:
Christoph Nakazawa
2019-09-13 07:47:58 -07:00
committed by Facebook Github Bot
parent 3666244a84
commit dbf070c51e
9 changed files with 13 additions and 428 deletions
@@ -1,33 +0,0 @@
/**
* 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.
*
* @flow
* @format
*/
'use strict';
import type {TurboModule} from '../../TurboModule/RCTExport';
import * as TurboModuleRegistry from '../../TurboModule/TurboModuleRegistry';
export type TimePickerOptions = {|
hour?: number,
minute?: number,
is24Hour?: boolean,
mode?: string,
|};
export type TimePickerResult = {|
action: string,
hour: number,
minute: number,
|};
export interface Spec extends TurboModule {
+open: (options: TimePickerOptions) => Promise<TimePickerResult>;
}
export default (TurboModuleRegistry.get<Spec>('TimePickerAndroid'): ?Spec);
@@ -1,80 +0,0 @@
/**
* 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 strict-local
*/
'use strict';
import NativeTimePickerAndroid, {
type TimePickerOptions,
type TimePickerResult,
} from './NativeTimePickerAndroid';
/**
* Opens the standard Android time picker dialog.
*
* ### Example
*
* ```
* try {
* const {action, hour, minute} = await TimePickerAndroid.open({
* hour: 14,
* minute: 0,
* is24Hour: false, // Will display '2 PM'
* });
* if (action !== TimePickerAndroid.dismissedAction) {
* // Selected hour (0-23), minute (0-59)
* }
* } catch ({code, message}) {
* console.warn('Cannot open time picker', message);
* }
* ```
*/
class TimePickerAndroid {
/**
* Opens the standard Android time picker dialog.
*
* The available keys for the `options` object are:
* * `hour` (0-23) - the hour to show, defaults to the current time
* * `minute` (0-59) - the minute to show, defaults to the current time
* * `is24Hour` (boolean) - If `true`, the picker uses the 24-hour format. If `false`,
* the picker shows an AM/PM chooser. If undefined, the default for the current locale
* is used.
* * `mode` (`enum('clock', 'spinner', 'default')`) - set the time picker mode
* - 'clock': Show a time picker in clock mode.
* - 'spinner': Show a time picker in spinner mode.
* - 'default': Show a default time picker based on Android versions.
*
* Returns a Promise which will be invoked an object containing `action`, `hour` (0-23),
* `minute` (0-59) if the user picked a time. If the user dismissed the dialog, the Promise will
* still be resolved with action being `TimePickerAndroid.dismissedAction` and all the other keys
* being undefined. **Always** check whether the `action` before reading the values.
*/
static async open(
options: TimePickerOptions,
): Promise<$ReadOnly<TimePickerResult>> {
if (NativeTimePickerAndroid) {
return NativeTimePickerAndroid.open(options);
} else {
return Promise.reject({
message: 'TimePickerAndroid is not supported on this platform.',
});
}
}
/**
* A time has been selected.
*/
static +timeSetAction: 'timeSetAction' = 'timeSetAction';
/**
* The dialog has been dismissed.
*/
static +dismissedAction: 'dismissedAction' = 'dismissedAction';
}
module.exports = TimePickerAndroid;
@@ -1995,39 +1995,6 @@ namespace facebook {
} // namespace react
} // namespace facebook
@implementation RCTCxxConvert (NativeTimePickerAndroid_TimePickerOptions)
+ (RCTManagedPointer *)JS_NativeTimePickerAndroid_TimePickerOptions:(id)json
{
return facebook::react::managedPointer<JS::NativeTimePickerAndroid::TimePickerOptions>(json);
}
@end
namespace facebook {
namespace react {
static facebook::jsi::Value __hostFunction_NativeTimePickerAndroidSpecJSI_open(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) {
return static_cast<ObjCTurboModule&>(turboModule).invokeObjCMethod(rt, PromiseKind, "open", @selector(open:resolve:reject:), args, count);
}
NativeTimePickerAndroidSpecJSI::NativeTimePickerAndroidSpecJSI(id<RCTTurboModule> instance, std::shared_ptr<JSCallInvoker> jsInvoker)
: ObjCTurboModule("TimePickerAndroid", instance, jsInvoker) {
methodMap_["open"] = MethodMetadata {1, __hostFunction_NativeTimePickerAndroidSpecJSI_open};
setMethodArgConversionSelector(@"open", 0, @"JS_NativeTimePickerAndroid_TimePickerOptions:");
}
} // namespace react
} // namespace facebook
@implementation RCTCxxConvert (NativeTimePickerAndroid_TimePickerResult)
+ (RCTManagedPointer *)JS_NativeTimePickerAndroid_TimePickerResult:(id)json
{
return facebook::react::managedPointer<JS::NativeTimePickerAndroid::TimePickerResult>(json);
}
@end
namespace facebook {
namespace react {
@@ -2038,63 +2038,6 @@ namespace facebook {
};
} // namespace react
} // namespace facebook
namespace JS {
namespace NativeTimePickerAndroid {
struct TimePickerOptions {
folly::Optional<double> hour() const;
folly::Optional<double> minute() const;
folly::Optional<bool> is24Hour() const;
NSString *mode() const;
TimePickerOptions(NSDictionary *const v) : _v(v) {}
private:
NSDictionary *_v;
};
}
}
@interface RCTCxxConvert (NativeTimePickerAndroid_TimePickerOptions)
+ (RCTManagedPointer *)JS_NativeTimePickerAndroid_TimePickerOptions:(id)json;
@end
@protocol NativeTimePickerAndroidSpec <RCTBridgeModule, RCTTurboModule>
- (void)open:(JS::NativeTimePickerAndroid::TimePickerOptions &)options
resolve:(RCTPromiseResolveBlock)resolve
reject:(RCTPromiseRejectBlock)reject;
@end
namespace facebook {
namespace react {
/**
* ObjC++ class for module 'TimePickerAndroid'
*/
class JSI_EXPORT NativeTimePickerAndroidSpecJSI : public ObjCTurboModule {
public:
NativeTimePickerAndroidSpecJSI(id<RCTTurboModule> instance, std::shared_ptr<JSCallInvoker> jsInvoker);
};
} // namespace react
} // namespace facebook
namespace JS {
namespace NativeTimePickerAndroid {
struct TimePickerResult {
NSString *action() const;
double hour() const;
double minute() const;
TimePickerResult(NSDictionary *const v) : _v(v) {}
private:
NSDictionary *_v;
};
}
}
@interface RCTCxxConvert (NativeTimePickerAndroid_TimePickerResult)
+ (RCTManagedPointer *)JS_NativeTimePickerAndroid_TimePickerResult:(id)json;
@end
@protocol NativeTimingSpec <RCTBridgeModule, RCTTurboModule>
- (void)createTimer:(double)callbackID
@@ -3074,41 +3017,6 @@ inline JS::NativeStatusBarManager::Constants::Builder::Builder(const Input i) :
inline JS::NativeStatusBarManager::Constants::Builder::Builder(Constants i) : _factory(^{
return i.unsafeRawValue();
}) {}
inline folly::Optional<double> JS::NativeTimePickerAndroid::TimePickerOptions::hour() const
{
id const p = _v[@"hour"];
return RCTBridgingToOptionalDouble(p);
}
inline folly::Optional<double> JS::NativeTimePickerAndroid::TimePickerOptions::minute() const
{
id const p = _v[@"minute"];
return RCTBridgingToOptionalDouble(p);
}
inline folly::Optional<bool> JS::NativeTimePickerAndroid::TimePickerOptions::is24Hour() const
{
id const p = _v[@"is24Hour"];
return RCTBridgingToOptionalBool(p);
}
inline NSString *JS::NativeTimePickerAndroid::TimePickerOptions::mode() const
{
id const p = _v[@"mode"];
return RCTBridgingToString(p);
}
inline NSString *JS::NativeTimePickerAndroid::TimePickerResult::action() const
{
id const p = _v[@"action"];
return RCTBridgingToString(p);
}
inline double JS::NativeTimePickerAndroid::TimePickerResult::hour() const
{
id const p = _v[@"hour"];
return RCTBridgingToDouble(p);
}
inline double JS::NativeTimePickerAndroid::TimePickerResult::minute() const
{
id const p = _v[@"minute"];
return RCTBridgingToDouble(p);
}
inline JS::NativeToastAndroid::Constants::Builder::Builder(const Input i) : _factory(^{
NSMutableDictionary *d = [NSMutableDictionary new];
auto SHORT = i.SHORT.get();
@@ -1,125 +0,0 @@
/**
* 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
*/
'use strict';
const React = require('react');
const {
TimePickerAndroid,
StyleSheet,
Text,
TouchableWithoutFeedback,
} = require('react-native');
const RNTesterBlock = require('../../components/RNTesterBlock');
const RNTesterPage = require('../../components/RNTesterPage');
class TimePickerAndroidExample extends React.Component {
state = {
isoFormatText: 'pick a time (24-hour format)',
presetHour: 4,
presetMinute: 4,
presetText: 'pick a time, default: 4:04AM',
simpleText: 'pick a time',
clockText: 'pick a time',
spinnerText: 'pick a time',
defaultText: 'pick a time',
};
showPicker = async (stateKey, options) => {
try {
const {action, minute, hour} = await TimePickerAndroid.open(options);
const newState = {};
if (action === TimePickerAndroid.timeSetAction) {
newState[stateKey + 'Text'] = _formatTime(hour, minute);
newState[stateKey + 'Hour'] = hour;
newState[stateKey + 'Minute'] = minute;
} else if (action === TimePickerAndroid.dismissedAction) {
newState[stateKey + 'Text'] = 'dismissed';
}
this.setState(newState);
} catch ({code, message}) {
console.warn(`Error in example '${stateKey}': `, message);
}
};
render() {
return (
<RNTesterPage title="TimePickerAndroid">
<RNTesterBlock title="Simple time picker">
<TouchableWithoutFeedback
onPress={this.showPicker.bind(this, 'simple', {})}>
<Text style={styles.text}>{this.state.simpleText}</Text>
</TouchableWithoutFeedback>
</RNTesterBlock>
<RNTesterBlock title="Simple clock time picker">
<TouchableWithoutFeedback
onPress={this.showPicker.bind(this, 'clock', {mode: 'clock'})}>
<Text style={styles.text}>{this.state.clockText}</Text>
</TouchableWithoutFeedback>
</RNTesterBlock>
<RNTesterBlock title="Simple spinner time picker">
<TouchableWithoutFeedback
onPress={this.showPicker.bind(this, 'spinner', {mode: 'spinner'})}>
<Text style={styles.text}>{this.state.spinnerText}</Text>
</TouchableWithoutFeedback>
</RNTesterBlock>
<RNTesterBlock title="Simple default time picker">
<TouchableWithoutFeedback
onPress={this.showPicker.bind(this, 'default', {mode: 'default'})}>
<Text style={styles.text}>{this.state.defaultText}</Text>
</TouchableWithoutFeedback>
</RNTesterBlock>
<RNTesterBlock title="Time picker with pre-set time">
<TouchableWithoutFeedback
onPress={this.showPicker.bind(this, 'preset', {
hour: this.state.presetHour,
minute: this.state.presetMinute,
})}>
<Text style={styles.text}>{this.state.presetText}</Text>
</TouchableWithoutFeedback>
</RNTesterBlock>
<RNTesterBlock title="Time picker with 24-hour time format">
<TouchableWithoutFeedback
onPress={this.showPicker.bind(this, 'isoFormat', {
hour: this.state.isoFormatHour,
minute: this.state.isoFormatMinute,
is24Hour: true,
})}>
<Text style={styles.text}>{this.state.isoFormatText}</Text>
</TouchableWithoutFeedback>
</RNTesterBlock>
</RNTesterPage>
);
}
}
/**
* Returns e.g. '3:05'.
*/
function _formatTime(hour, minute) {
return hour + ':' + (minute < 10 ? '0' + minute : minute);
}
const styles = StyleSheet.create({
text: {
color: 'black',
},
});
exports.title = 'TimePickerAndroid';
exports.description = 'Standard Android time picker dialog';
exports.examples = [
{
title: 'Simple time picker',
render: function(): React.Element<typeof TimePickerAndroidExample> {
return <TimePickerAndroidExample />;
},
},
];
@@ -204,10 +204,6 @@ const APIExamples: Array<RNTesterExample> = [
key: 'ShareExample',
module: require('../examples/Share/ShareExample'),
},
{
key: 'TimePickerAndroidExample',
module: require('../examples/TimePicker/TimePickerAndroidExample'),
},
{
key: 'TimerExample',
module: require('../examples/Timer/TimerExample'),
@@ -29,7 +29,6 @@ require('./ScrollViewTestModule');
require('./ShareTestModule');
require('./SwipeRefreshLayoutTestModule');
require('./TextInputTestModule');
require('./TimePickerDialogTestModule');
// Define catalyst test apps used in integration tests
const {AppRegistry} = require('react-native');
@@ -116,11 +115,6 @@ const apps = [
appKey: 'TestIdTestApp',
component: () => require('./TestIdTestModule').TestIdTestApp,
},
{
appKey: 'TimePickerDialogTestApp',
component: () =>
require('./TimePickerDialogTestModule').TimePickerDialogTestApp,
},
{
appKey: 'TouchBubblingTestAppModule',
component: () => require('./TouchBubblingTestAppModule'),
@@ -1,45 +0,0 @@
/**
* 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
*/
'use strict';
const React = require('react');
const {NativeModules, TimePickerAndroid, View} = require('react-native');
const BatchedBridge = require('react-native/Libraries/BatchedBridge/BatchedBridge');
const {TimePickerDialogRecordingModule: RecordingModule} = NativeModules;
class TimePickerDialogTestApp extends React.Component {
render() {
return <View />;
}
}
const TimePickerDialogTestModule = {
TimePickerDialogTestApp: TimePickerDialogTestApp,
showTimePickerDialog: function(options) {
TimePickerAndroid.open(options).then(
({action, hour, minute}) => {
if (action === TimePickerAndroid.timeSetAction) {
RecordingModule.recordTime(hour, minute);
} else if (action === TimePickerAndroid.dismissedAction) {
RecordingModule.recordDismissed();
}
},
({code, message}) => RecordingModule.recordError(),
);
},
};
BatchedBridge.registerCallableModule(
'TimePickerDialogTestModule',
TimePickerDialogTestModule,
);
module.exports = TimePickerDialogTestModule;
+13 -10
View File
@@ -77,7 +77,6 @@ import typeof Share from './Libraries/Share/Share';
import typeof StatusBarIOS from './Libraries/Components/StatusBar/StatusBarIOS';
import typeof StyleSheet from './Libraries/StyleSheet/StyleSheet';
import typeof Systrace from './Libraries/Performance/Systrace';
import typeof TimePickerAndroid from './Libraries/Components/TimePickerAndroid/TimePickerAndroid';
import typeof ToastAndroid from './Libraries/Components/ToastAndroid/ToastAndroid';
import typeof * as TurboModuleRegistry from './Libraries/TurboModule/TurboModuleRegistry';
import typeof TVEventHandler from './Libraries/Components/AppleTV/TVEventHandler';
@@ -373,15 +372,6 @@ module.exports = {
get Systrace(): Systrace {
return require('./Libraries/Performance/Systrace');
},
get TimePickerAndroid(): TimePickerAndroid {
warnOnce(
'TimePickerAndroid-merged',
'TimePickerAndroid has been merged with DatePickerIOS and DatePickerAndroid and will be removed in a future release. ' +
"It can now be installed and imported from '@react-native-community/datetimepicker' instead of 'react-native'. " +
'See https://github.com/react-native-community/react-native-datetimepicker',
);
return require('./Libraries/Components/TimePickerAndroid/TimePickerAndroid');
},
get ToastAndroid(): ToastAndroid {
return require('./Libraries/Components/ToastAndroid/ToastAndroid');
},
@@ -561,6 +551,19 @@ if (__DEV__) {
},
});
// $FlowFixMe This is intentional: Flow will error when attempting to access TimePickerAndroid.
Object.defineProperty(module.exports, 'TimePickerAndroid', {
configurable: true,
get() {
invariant(
false,
'TimePickerAndroid has been removed from React Native. ' +
"It can now be installed and imported from '@react-native-community/datetimepicker' instead of 'react-native'. " +
'See https://github.com/react-native-community/react-native-datetimepicker',
);
},
});
// $FlowFixMe This is intentional: Flow will error when attempting to access ViewPagerAndroid.
Object.defineProperty(module.exports, 'ViewPagerAndroid', {
configurable: true,