Browse Source

fix: date changes for all mounted android modal pickers (#399)

master
Henning Hall 3 years ago
committed by GitHub
parent
commit
9aa20c2220
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 18 additions and 44 deletions
  1. +8
    -6
      android/src/main/java/com/henninghall/date_picker/DatePickerModule.java
  2. +0
    -10
      android/src/main/java/com/henninghall/date_picker/Emitter.java
  3. +10
    -28
      src/DatePickerAndroid.js

+ 8
- 6
android/src/main/java/com/henninghall/date_picker/DatePickerModule.java View File

@ -7,6 +7,7 @@ import android.view.View;
import android.widget.LinearLayout; import android.widget.LinearLayout;
import android.widget.RelativeLayout; import android.widget.RelativeLayout;
import com.facebook.react.bridge.Callback;
import com.facebook.react.bridge.Dynamic; import com.facebook.react.bridge.Dynamic;
import com.facebook.react.bridge.ReactApplicationContext; import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule; import com.facebook.react.bridge.ReactContextBaseJavaModule;
@ -34,13 +35,14 @@ public class DatePickerModule extends ReactContextBaseJavaModule {
} }
@ReactMethod @ReactMethod
public void openPicker(ReadableMap props){
public void openPicker(ReadableMap props, Callback onConfirm, Callback onCancel){
PickerView picker = createPicker(props); PickerView picker = createPicker(props);
AlertDialog dialog = createDialog(props, picker);
AlertDialog dialog = createDialog(props, picker, onConfirm, onCancel);
dialog.show(); 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 title = props.getString("title");
String confirmText = props.getString("confirmText"); String confirmText = props.getString("confirmText");
final String cancelText = props.getString("cancelText"); final String cancelText = props.getString("cancelText");
@ -52,20 +54,20 @@ public class DatePickerModule extends ReactContextBaseJavaModule {
.setView(pickerWithMargin) .setView(pickerWithMargin)
.setPositiveButton(confirmText, new DialogInterface.OnClickListener() { .setPositiveButton(confirmText, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) { public void onClick(DialogInterface dialog, int id) {
Emitter.onConfirm(picker.getDate());
onConfirm.invoke(picker.getDate());
dialog.dismiss(); dialog.dismiss();
} }
}) })
.setNegativeButton(cancelText, new DialogInterface.OnClickListener() { .setNegativeButton(cancelText, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) { public void onClick(DialogInterface dialog, int id) {
Emitter.onCancel();
onCancel.invoke();
dialog.dismiss(); dialog.dismiss();
} }
}) })
.setOnCancelListener(new DialogInterface.OnCancelListener() { .setOnCancelListener(new DialogInterface.OnCancelListener() {
@Override @Override
public void onCancel(DialogInterface dialogInterface) { public void onCancel(DialogInterface dialogInterface) {
Emitter.onCancel();
onCancel.invoke();
} }
}) })
.create(); .create();

+ 0
- 10
android/src/main/java/com/henninghall/date_picker/Emitter.java View File

@ -27,14 +27,4 @@ public class Emitter {
eventEmitter().receiveEvent(view.getId(), "dateChange", event); 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);
}
} }

+ 10
- 28
src/DatePickerAndroid.js View File

@ -1,10 +1,5 @@
import React from 'react' import React from 'react'
import {
StyleSheet,
requireNativeComponent,
NativeModules,
NativeEventEmitter,
} from 'react-native'
import { requireNativeComponent, NativeModules } from 'react-native'
function addMinutes(date, minutesToAdd) { function addMinutes(date, minutesToAdd) {
return new Date(date.valueOf() + minutesToAdd * 60 * 1000) return new Date(date.valueOf() + minutesToAdd * 60 * 1000)
@ -21,32 +16,15 @@ const timeModeWidth = 240
const defaultWidth = 310 const defaultWidth = 310
class DatePickerAndroid extends React.PureComponent { 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() { render() {
const props = this.getProps() const props = this.getProps()
if (props.modal) { if (props.modal) {
if (props.open) { if (props.open) {
NativeModules.RNDatePicker.openPicker(props)
NativeModules.RNDatePicker.openPicker(
props,
this._onConfirm,
this.props.onCancel
)
} }
return null return null
} }
@ -98,6 +76,10 @@ class DatePickerAndroid extends React.PureComponent {
return addMinutes(date, this.props.timeZoneOffsetInMinutes).toISOString() return addMinutes(date, this.props.timeZoneOffsetInMinutes).toISOString()
} }
_onConfirm = (isoDate) => {
this.props.onConfirm(this._fromIsoWithTimeZoneOffset(isoDate))
}
} }
export default DatePickerAndroid export default DatePickerAndroid

Loading…
Cancel
Save