From 9aa20c2220a5e42a481ed01da50bbddb46c3dca4 Mon Sep 17 00:00:00 2001 From: Henning Hall Date: Sat, 2 Oct 2021 12:06:39 +0200 Subject: [PATCH] fix: date changes for all mounted android modal pickers (#399) --- .../date_picker/DatePickerModule.java | 14 ++++--- .../com/henninghall/date_picker/Emitter.java | 10 ----- src/DatePickerAndroid.js | 38 +++++-------------- 3 files changed, 18 insertions(+), 44 deletions(-) diff --git a/android/src/main/java/com/henninghall/date_picker/DatePickerModule.java b/android/src/main/java/com/henninghall/date_picker/DatePickerModule.java index 3b70fff..121c23f 100644 --- a/android/src/main/java/com/henninghall/date_picker/DatePickerModule.java +++ b/android/src/main/java/com/henninghall/date_picker/DatePickerModule.java @@ -7,6 +7,7 @@ import android.view.View; import android.widget.LinearLayout; import android.widget.RelativeLayout; +import com.facebook.react.bridge.Callback; import com.facebook.react.bridge.Dynamic; import com.facebook.react.bridge.ReactApplicationContext; import com.facebook.react.bridge.ReactContextBaseJavaModule; @@ -34,13 +35,14 @@ public class DatePickerModule extends ReactContextBaseJavaModule { } @ReactMethod - public void openPicker(ReadableMap props){ + public void openPicker(ReadableMap props, Callback onConfirm, Callback onCancel){ PickerView picker = createPicker(props); - AlertDialog dialog = createDialog(props, picker); + AlertDialog dialog = createDialog(props, picker, onConfirm, onCancel); dialog.show(); } - private AlertDialog createDialog (ReadableMap props, final PickerView picker) { + private AlertDialog createDialog( + ReadableMap props, final PickerView picker, final Callback onConfirm, final Callback onCancel) { String title = props.getString("title"); String confirmText = props.getString("confirmText"); final String cancelText = props.getString("cancelText"); @@ -52,20 +54,20 @@ public class DatePickerModule extends ReactContextBaseJavaModule { .setView(pickerWithMargin) .setPositiveButton(confirmText, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { - Emitter.onConfirm(picker.getDate()); + onConfirm.invoke(picker.getDate()); dialog.dismiss(); } }) .setNegativeButton(cancelText, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { - Emitter.onCancel(); + onCancel.invoke(); dialog.dismiss(); } }) .setOnCancelListener(new DialogInterface.OnCancelListener() { @Override public void onCancel(DialogInterface dialogInterface) { - Emitter.onCancel(); + onCancel.invoke(); } }) .create(); diff --git a/android/src/main/java/com/henninghall/date_picker/Emitter.java b/android/src/main/java/com/henninghall/date_picker/Emitter.java index f388604..b7c42d1 100644 --- a/android/src/main/java/com/henninghall/date_picker/Emitter.java +++ b/android/src/main/java/com/henninghall/date_picker/Emitter.java @@ -27,14 +27,4 @@ public class Emitter { eventEmitter().receiveEvent(view.getId(), "dateChange", event); } - public static void onConfirm(String date) { - WritableMap event = Arguments.createMap(); - event.putString("date", date); - deviceEventEmitter().emit("onConfirm", event); - } - - public static void onCancel() { - WritableMap event = Arguments.createMap(); - deviceEventEmitter().emit("onCancel", event); - } } diff --git a/src/DatePickerAndroid.js b/src/DatePickerAndroid.js index 1994ced..3cc5fbe 100644 --- a/src/DatePickerAndroid.js +++ b/src/DatePickerAndroid.js @@ -1,10 +1,5 @@ import React from 'react' -import { - StyleSheet, - requireNativeComponent, - NativeModules, - NativeEventEmitter, -} from 'react-native' +import { requireNativeComponent, NativeModules } from 'react-native' function addMinutes(date, minutesToAdd) { return new Date(date.valueOf() + minutesToAdd * 60 * 1000) @@ -21,32 +16,15 @@ const timeModeWidth = 240 const defaultWidth = 310 class DatePickerAndroid extends React.PureComponent { - componentDidMount() { - const { onConfirm, onCancel } = this.props - const eventEmitter = new NativeEventEmitter(NativeModules.RNDatePicker) - this.confirmListener = eventEmitter.addListener( - 'onConfirm', - ({ date: isoDate }) => { - if (onConfirm) { - onConfirm(this._fromIsoWithTimeZoneOffset(isoDate)) - } - } - ) - this.cancelListener = eventEmitter.addListener('onCancel', () => { - if (onCancel) onCancel() - }) - } - - componentWillUnmount() { - this.confirmListener.remove() - this.cancelListener.remove() - } - render() { const props = this.getProps() if (props.modal) { if (props.open) { - NativeModules.RNDatePicker.openPicker(props) + NativeModules.RNDatePicker.openPicker( + props, + this._onConfirm, + this.props.onCancel + ) } return null } @@ -98,6 +76,10 @@ class DatePickerAndroid extends React.PureComponent { return addMinutes(date, this.props.timeZoneOffsetInMinutes).toISOString() } + + _onConfirm = (isoDate) => { + this.props.onConfirm(this._fromIsoWithTimeZoneOffset(isoDate)) + } } export default DatePickerAndroid