From c0d6fe934555f7aedcde835d831590ae1ab52722 Mon Sep 17 00:00:00 2001 From: aureosouza <71460422+aureosouza@users.noreply.github.com> Date: Sun, 12 Feb 2023 15:03:01 +0100 Subject: [PATCH] Adds closePicker function (#602) Co-authored-by: Henning Hall --- .../date_picker/DatePickerModule.java | 9 ++++++++- ios/RNDatePicker/RNDatePickerManager.h | 2 ++ ios/RNDatePicker/RNDatePickerManager.m | 16 +++++++++++----- src/DatePickerAndroid.js | 4 +++- src/DatePickerIOS.js | 6 ++++-- 5 files changed, 28 insertions(+), 9 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 121c23f..a7d6550 100644 --- a/android/src/main/java/com/henninghall/date_picker/DatePickerModule.java +++ b/android/src/main/java/com/henninghall/date_picker/DatePickerModule.java @@ -19,6 +19,8 @@ import net.time4j.android.ApplicationStarter; public class DatePickerModule extends ReactContextBaseJavaModule { + private AlertDialog dialog; + DatePickerModule(ReactApplicationContext context) { super(context); ApplicationStarter.initialize(context, false); // false = no need to prefetch on time data background tread @@ -37,10 +39,15 @@ public class DatePickerModule extends ReactContextBaseJavaModule { @ReactMethod public void openPicker(ReadableMap props, Callback onConfirm, Callback onCancel){ PickerView picker = createPicker(props); - AlertDialog dialog = createDialog(props, picker, onConfirm, onCancel); + dialog = createDialog(props, picker, onConfirm, onCancel); dialog.show(); } + @ReactMethod + public void closePicker(){ + dialog.dismiss(); + } + private AlertDialog createDialog( ReadableMap props, final PickerView picker, final Callback onConfirm, final Callback onCancel) { String title = props.getString("title"); diff --git a/ios/RNDatePicker/RNDatePickerManager.h b/ios/RNDatePicker/RNDatePickerManager.h index 5e791e6..6a4f206 100644 --- a/ios/RNDatePicker/RNDatePickerManager.h +++ b/ios/RNDatePicker/RNDatePickerManager.h @@ -10,4 +10,6 @@ @interface RNDatePickerManager : RCTViewManager +@property (strong, nonatomic) UIViewController *topViewController; + @end diff --git a/ios/RNDatePicker/RNDatePickerManager.m b/ios/RNDatePicker/RNDatePickerManager.m index 18a69fb..b19c62c 100644 --- a/ios/RNDatePicker/RNDatePickerManager.m +++ b/ios/RNDatePicker/RNDatePickerManager.m @@ -156,16 +156,22 @@ RCT_EXPORT_METHOD(openPicker:(NSDictionary *) props } // Finding the top view controller which is neccessary to be able to show the picker from within modal - UIViewController *topViewController = rootViewController; - while (topViewController.presentedViewController){ - topViewController = topViewController.presentedViewController; + _topViewController = rootViewController; + while (_topViewController.presentedViewController){ + _topViewController = _topViewController.presentedViewController; } - - [topViewController presentViewController:alertController animated:YES completion:nil]; + [_topViewController presentViewController:alertController animated:YES completion:nil]; }); } +RCT_EXPORT_METHOD(closePicker) +{ + dispatch_async(dispatch_get_main_queue(), ^{ + [_topViewController dismissViewControllerAnimated:YES completion:nil]; + }); +} + - (double) getPickerWidth :(UIView *) alertView { bool iPad = UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad; diff --git a/src/DatePickerAndroid.js b/src/DatePickerAndroid.js index 26610e5..8ed7134 100644 --- a/src/DatePickerAndroid.js +++ b/src/DatePickerAndroid.js @@ -20,7 +20,7 @@ class DatePickerAndroid extends React.PureComponent { const props = this.getProps() const isClosed = this._isCurrentlyClosed(); - this.previousProps = props; + this.previousProps = props; if (props.modal) { if (props.open && isClosed) { NativeModules.RNDatePicker.openPicker( @@ -28,6 +28,8 @@ class DatePickerAndroid extends React.PureComponent { this._onConfirm, this.props.onCancel ) + } else if (!props.open && !isClosed) { + NativeModules.RNDatePicker.closePicker() } return null } diff --git a/src/DatePickerIOS.js b/src/DatePickerIOS.js index 330c4c7..6821643 100644 --- a/src/DatePickerIOS.js +++ b/src/DatePickerIOS.js @@ -47,7 +47,7 @@ export default class DatePickerIOS extends React.Component { const props = this._toIosProps(this.props) const isClosed = this._isCurrentlyClosed(); - this.previousProps = props; + this.previousProps = props; if (props.modal) { if (props.open && isClosed) { NativeModules.RNDatePickerManager.openPicker( @@ -55,6 +55,8 @@ export default class DatePickerIOS extends React.Component { this._onConfirm, props.onCancel ) + } else if (!props.open && !isClosed) { + NativeModules.RNDatePickerManager.closePicker() } return null } @@ -72,7 +74,7 @@ export default class DatePickerIOS extends React.Component { /> ) } - + _isCurrentlyClosed = () => !this.previousProps || !this.previousProps.open }