mirror of
https://github.com/facebook/react-native.git
synced 2025-11-01 09:14:26 +00:00
[iOS] [Fixed] - Revert [previous incomplete fix](https://github.com/facebook/react-native/commit/bd2b7d6c0366b5f19de56b71cb706a0af4b0be43) for [an issue](https://github.com/facebook/react-native/issues/26473) with Modal’s onDismiss prop.
This reverts commit bd2b7d6c03.
This commit is contained in:
@@ -12,8 +12,11 @@
|
||||
|
||||
const AppContainer = require('../ReactNative/AppContainer');
|
||||
const I18nManager = require('../ReactNative/I18nManager');
|
||||
const PropTypes = require('prop-types');
|
||||
const NativeEventEmitter = require('../EventEmitter/NativeEventEmitter');
|
||||
import NativeModalManager from './NativeModalManager';
|
||||
const Platform = require('../Utilities/Platform');
|
||||
const React = require('react');
|
||||
const PropTypes = require('prop-types');
|
||||
const ScrollView = require('../Components/ScrollView/ScrollView');
|
||||
const StyleSheet = require('../StyleSheet/StyleSheet');
|
||||
const View = require('../Components/View/View');
|
||||
@@ -22,6 +25,12 @@ import type {ViewProps} from '../Components/View/ViewPropTypes';
|
||||
import type {DirectEventHandler} from '../Types/CodegenTypes';
|
||||
import type EmitterSubscription from '../vendor/emitter/EmitterSubscription';
|
||||
import RCTModalHostView from './RCTModalHostViewNativeComponent';
|
||||
|
||||
const ModalEventEmitter =
|
||||
Platform.OS === 'ios' && NativeModalManager != null
|
||||
? new NativeEventEmitter(NativeModalManager)
|
||||
: null;
|
||||
|
||||
/**
|
||||
* The Modal component is a simple way to present content above an enclosing view.
|
||||
*
|
||||
@@ -178,9 +187,22 @@ class Modal extends React.Component<Props> {
|
||||
};
|
||||
}
|
||||
|
||||
componentDidMount() {
|
||||
if (ModalEventEmitter) {
|
||||
this._eventSubscription = ModalEventEmitter.addListener(
|
||||
'modalDismissed',
|
||||
event => {
|
||||
if (event.modalID === this._identifier && this.props.onDismiss) {
|
||||
this.props.onDismiss();
|
||||
}
|
||||
},
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
componentWillUnmount() {
|
||||
if (this.props.onDismiss != null) {
|
||||
this.props.onDismiss();
|
||||
if (this._eventSubscription) {
|
||||
this._eventSubscription.remove();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -86,6 +86,14 @@ type NativeProps = $ReadOnly<{|
|
||||
*/
|
||||
onShow?: ?DirectEventHandler<null>,
|
||||
|
||||
/**
|
||||
* The `onDismiss` prop allows passing a function that will be called once
|
||||
* the modal has been dismissed.
|
||||
*
|
||||
* See https://facebook.github.io/react-native/docs/modal.html#ondismiss
|
||||
*/
|
||||
onDismiss?: ?BubblingEventHandler<null>,
|
||||
|
||||
/**
|
||||
* Deprecated. Use the `animationType` prop instead.
|
||||
*/
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
#import "RCTBridge.h"
|
||||
#import "RCTModalHostView.h"
|
||||
#import "RCTModalHostViewController.h"
|
||||
#import "RCTModalManager.h"
|
||||
#import "RCTShadowView.h"
|
||||
#import "RCTUtils.h"
|
||||
|
||||
@@ -80,10 +81,15 @@ RCT_EXPORT_MODULE()
|
||||
|
||||
- (void)dismissModalHostView:(RCTModalHostView *)modalHostView withViewController:(RCTModalHostViewController *)viewController animated:(BOOL)animated
|
||||
{
|
||||
dispatch_block_t completionBlock = ^{
|
||||
if (modalHostView.identifier) {
|
||||
[[self.bridge moduleForClass:[RCTModalManager class]] modalDismissed:modalHostView.identifier];
|
||||
}
|
||||
};
|
||||
if (_dismissalBlock) {
|
||||
_dismissalBlock([modalHostView reactViewController], viewController, animated, nil);
|
||||
_dismissalBlock([modalHostView reactViewController], viewController, animated, completionBlock);
|
||||
} else {
|
||||
[viewController.presentingViewController dismissViewControllerAnimated:animated completion:nil];
|
||||
[viewController.presentingViewController dismissViewControllerAnimated:animated completion:completionBlock];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,17 @@
|
||||
/**
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#import <UIKit/UIKit.h>
|
||||
|
||||
#import <React/RCTBridgeModule.h>
|
||||
#import <React/RCTEventEmitter.h>
|
||||
|
||||
@interface RCTModalManager : RCTEventEmitter <RCTBridgeModule>
|
||||
|
||||
- (void)modalDismissed:(NSNumber *)modalID;
|
||||
|
||||
@end
|
||||
@@ -0,0 +1,42 @@
|
||||
/**
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#import "RCTModalManager.h"
|
||||
|
||||
@interface RCTModalManager ()
|
||||
|
||||
@property BOOL shouldEmit;
|
||||
|
||||
@end
|
||||
|
||||
@implementation RCTModalManager
|
||||
|
||||
RCT_EXPORT_MODULE();
|
||||
|
||||
- (NSArray<NSString *> *)supportedEvents
|
||||
{
|
||||
return @[ @"modalDismissed" ];
|
||||
}
|
||||
|
||||
- (void)startObserving
|
||||
{
|
||||
_shouldEmit = YES;
|
||||
}
|
||||
|
||||
- (void)stopObserving
|
||||
{
|
||||
_shouldEmit = NO;
|
||||
}
|
||||
|
||||
- (void)modalDismissed:(NSNumber *)modalID
|
||||
{
|
||||
if (_shouldEmit) {
|
||||
[self sendEventWithName:@"modalDismissed" body:@{ @"modalID": modalID }];
|
||||
}
|
||||
}
|
||||
|
||||
@end
|
||||
Reference in New Issue
Block a user