mirror of
https://github.com/facebook/react-native.git
synced 2025-11-01 09:14:26 +00:00
Remove TimePickerAndroid from React Native
Summary: Lean Core Reviewed By: rubennorte Differential Revision: D17344045 fbshipit-source-id: a5a7ab41075da93f8a1929059abe183838b00c82
This commit is contained in:
committed by
Facebook Github Bot
parent
3666244a84
commit
dbf070c51e
@@ -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;
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user