Skip to content

Commit 69589a0

Browse files
authored
fix: avoid crashing on web (#625)
1 parent e3c05a8 commit 69589a0

File tree

2 files changed

+107
-100
lines changed

2 files changed

+107
-100
lines changed

src/DateTimePickerAndroid.android.js

+102
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
/**
2+
* @format
3+
* @flow strict-local
4+
*/
5+
import {
6+
DATE_SET_ACTION,
7+
TIME_SET_ACTION,
8+
DISMISS_ACTION,
9+
NEUTRAL_BUTTON_ACTION,
10+
ANDROID_DISPLAY,
11+
ANDROID_MODE,
12+
ANDROID_EVT_TYPE,
13+
EVENT_TYPE_SET,
14+
} from './constants';
15+
import invariant from 'invariant';
16+
17+
import type {DateTimePickerEvent, AndroidNativeProps} from './types';
18+
import {
19+
getOpenPicker,
20+
timeZoneOffsetDateSetter,
21+
validateAndroidProps,
22+
} from './androidUtils';
23+
import pickers from './picker';
24+
25+
function open(props: AndroidNativeProps) {
26+
const {
27+
mode = ANDROID_MODE.date,
28+
display = ANDROID_DISPLAY.default,
29+
value: originalValue,
30+
is24Hour,
31+
minimumDate,
32+
maximumDate,
33+
neutralButtonLabel,
34+
minuteInterval,
35+
timeZoneOffsetInMinutes,
36+
onChange,
37+
onError,
38+
} = props;
39+
validateAndroidProps(props);
40+
invariant(originalValue, 'A date or time must be specified as `value` prop.');
41+
42+
const valueTimestamp = originalValue.getTime();
43+
const openPicker = getOpenPicker({
44+
mode,
45+
value: valueTimestamp,
46+
display,
47+
is24Hour,
48+
minimumDate,
49+
maximumDate,
50+
neutralButtonLabel,
51+
minuteInterval,
52+
timeZoneOffsetInMinutes,
53+
});
54+
55+
const presentPicker = async () => {
56+
try {
57+
const {action, day, month, year, minute, hour} = await openPicker();
58+
let date = new Date(valueTimestamp);
59+
let event: DateTimePickerEvent = {
60+
type: EVENT_TYPE_SET,
61+
nativeEvent: {},
62+
};
63+
64+
switch (action) {
65+
case DATE_SET_ACTION:
66+
date.setFullYear(year, month, day);
67+
date = timeZoneOffsetDateSetter(date, timeZoneOffsetInMinutes);
68+
event.nativeEvent.timestamp = date.getTime();
69+
onChange?.(event, date);
70+
break;
71+
72+
case TIME_SET_ACTION:
73+
date.setHours(hour, minute);
74+
date = timeZoneOffsetDateSetter(date, timeZoneOffsetInMinutes);
75+
event.nativeEvent.timestamp = date.getTime();
76+
onChange?.(event, date);
77+
break;
78+
79+
case NEUTRAL_BUTTON_ACTION:
80+
event.type = ANDROID_EVT_TYPE.neutralButtonPressed;
81+
onChange?.(event, originalValue);
82+
break;
83+
84+
case DISMISS_ACTION:
85+
default:
86+
event.type = ANDROID_EVT_TYPE.dismissed;
87+
onChange?.(event, originalValue);
88+
break;
89+
}
90+
} catch (error) {
91+
onError && onError(error);
92+
}
93+
};
94+
presentPicker();
95+
}
96+
97+
function dismiss(mode: AndroidNativeProps['mode']) {
98+
// $FlowFixMe - `AbstractComponent` [1] is not an instance type.
99+
pickers[mode].dismiss();
100+
}
101+
102+
export const DateTimePickerAndroid = {open, dismiss};

src/DateTimePickerAndroid.js

+5-100
Original file line numberDiff line numberDiff line change
@@ -1,102 +1,7 @@
1-
/**
2-
* @format
3-
* @flow strict-local
4-
*/
5-
import {
6-
DATE_SET_ACTION,
7-
TIME_SET_ACTION,
8-
DISMISS_ACTION,
9-
NEUTRAL_BUTTON_ACTION,
10-
ANDROID_DISPLAY,
11-
ANDROID_MODE,
12-
ANDROID_EVT_TYPE,
13-
EVENT_TYPE_SET,
14-
} from './constants';
15-
import invariant from 'invariant';
1+
import {Platform} from 'react-native';
162

17-
import type {DateTimePickerEvent, AndroidNativeProps} from './types';
18-
import {
19-
getOpenPicker,
20-
timeZoneOffsetDateSetter,
21-
validateAndroidProps,
22-
} from './androidUtils';
23-
import pickers from './picker';
3+
const warn = () => {
4+
console.warn(`DateTimePickerAndroid is not supported on: ${Platform.OS}`);
5+
};
246

25-
function open(props: AndroidNativeProps) {
26-
const {
27-
mode = ANDROID_MODE.date,
28-
display = ANDROID_DISPLAY.default,
29-
value: originalValue,
30-
is24Hour,
31-
minimumDate,
32-
maximumDate,
33-
neutralButtonLabel,
34-
minuteInterval,
35-
timeZoneOffsetInMinutes,
36-
onChange,
37-
onError,
38-
} = props;
39-
validateAndroidProps(props);
40-
invariant(originalValue, 'A date or time must be specified as `value` prop.');
41-
42-
const valueTimestamp = originalValue.getTime();
43-
const openPicker = getOpenPicker({
44-
mode,
45-
value: valueTimestamp,
46-
display,
47-
is24Hour,
48-
minimumDate,
49-
maximumDate,
50-
neutralButtonLabel,
51-
minuteInterval,
52-
timeZoneOffsetInMinutes,
53-
});
54-
55-
const presentPicker = async () => {
56-
try {
57-
const {action, day, month, year, minute, hour} = await openPicker();
58-
let date = new Date(valueTimestamp);
59-
let event: DateTimePickerEvent = {
60-
type: EVENT_TYPE_SET,
61-
nativeEvent: {},
62-
};
63-
64-
switch (action) {
65-
case DATE_SET_ACTION:
66-
date.setFullYear(year, month, day);
67-
date = timeZoneOffsetDateSetter(date, timeZoneOffsetInMinutes);
68-
event.nativeEvent.timestamp = date.getTime();
69-
onChange?.(event, date);
70-
break;
71-
72-
case TIME_SET_ACTION:
73-
date.setHours(hour, minute);
74-
date = timeZoneOffsetDateSetter(date, timeZoneOffsetInMinutes);
75-
event.nativeEvent.timestamp = date.getTime();
76-
onChange?.(event, date);
77-
break;
78-
79-
case NEUTRAL_BUTTON_ACTION:
80-
event.type = ANDROID_EVT_TYPE.neutralButtonPressed;
81-
onChange?.(event, originalValue);
82-
break;
83-
84-
case DISMISS_ACTION:
85-
default:
86-
event.type = ANDROID_EVT_TYPE.dismissed;
87-
onChange?.(event, originalValue);
88-
break;
89-
}
90-
} catch (error) {
91-
onError && onError(error);
92-
}
93-
};
94-
presentPicker();
95-
}
96-
97-
function dismiss(mode: AndroidNativeProps['mode']) {
98-
// $FlowFixMe - `AbstractComponent` [1] is not an instance type.
99-
pickers[mode].dismiss();
100-
}
101-
102-
export const DateTimePickerAndroid = {open, dismiss};
7+
export const DateTimePickerAndroid = {open: warn, dismiss: warn};

0 commit comments

Comments
 (0)