From 4bac2c0a85eca7ac8b15cd3bbf55beed8b7f9317 Mon Sep 17 00:00:00 2001 From: Fabrizio Bertoglio Date: Thu, 25 Jan 2024 09:44:11 +0800 Subject: [PATCH 01/13] update readme --- README.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/README.md b/README.md index 2524bc9..b630881 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,7 @@ # react-native-improved -- **Supports only react-native 0.73**. -- Support for other versions will be added in the future ([#18](https://github.com/fabOnReact/react-native-improved/issues/18)). +**Supports only react-native 0.73** ([#18](https://github.com/fabOnReact/react-native-improved/issues/18)). Provides different react-native iOS, Android and JS API fixes/PRs. From 351f0d41125be74a5cd13eed81fe544f3adaa8aa Mon Sep 17 00:00:00 2001 From: Fabrizio Bertoglio Date: Thu, 25 Jan 2024 12:23:17 +0800 Subject: [PATCH 02/13] partial implementation of #31498 --- .../RCTModalHostViewControllerImproved.h | 16 ++++++++++++ ios/Views/RCTModalHostViewImproved.h | 13 +++++++--- ...Improved.mm => RCTModalHostViewImproved.m} | 25 ++++++++++++++++--- ...r.mm => RCTModalHostViewImprovedManager.m} | 7 ++++++ 4 files changed, 54 insertions(+), 7 deletions(-) create mode 100644 ios/Views/RCTModalHostViewControllerImproved.h rename ios/Views/{RCTModalHostViewImproved.mm => RCTModalHostViewImproved.m} (54%) rename ios/Views/{RCTModalHostViewImprovedManager.mm => RCTModalHostViewImprovedManager.m} (75%) diff --git a/ios/Views/RCTModalHostViewControllerImproved.h b/ios/Views/RCTModalHostViewControllerImproved.h new file mode 100644 index 0000000..3404390 --- /dev/null +++ b/ios/Views/RCTModalHostViewControllerImproved.h @@ -0,0 +1,16 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#import +#import "RCTModalHostViewController.h" +#import "RCTModalHostView.h" + +@interface RCTModalHostViewControllerImproved : RCTModalHostViewController + +@property RCTModalHostView* modalHostView; + +@end diff --git a/ios/Views/RCTModalHostViewImproved.h b/ios/Views/RCTModalHostViewImproved.h index 48fce62..9d831e8 100644 --- a/ios/Views/RCTModalHostViewImproved.h +++ b/ios/Views/RCTModalHostViewImproved.h @@ -7,6 +7,8 @@ #import "RCTModalHostView.h" #import "RCTModalHostViewImproved.h" +#import "RCTModalHostViewControllerImproved.h" +#import "RCTModalHostViewController.h" NS_ASSUME_NONNULL_BEGIN @@ -15,17 +17,20 @@ NS_ASSUME_NONNULL_BEGIN @interface RCTModalHostViewImproved : RCTModalHostView @property (nonatomic, weak) id delegate; +@property (nonatomic, strong) UIWindow *modalWindow; + +- (void)dismissModalViewControllerWithCompletion:(void (^)(void))completion; @end @protocol RCTModalHostViewInteractorImproved -- (void)presentModalHostView:(RCTModalHostViewImproved *)modalHostView - withViewController:(RCTModalHostViewController *)viewController - animated:(BOOL)animated; -- (void)dismissModalHostView:(RCTModalHostViewImproved *)modalHostView +- (void)dismissModalHostView:(RCTModalHostView *)modalHostView withViewController:(RCTModalHostViewController *)viewController animated:(BOOL)animated; +- (void)dismissModalHostViewWithCompletion:(RCTModalHostView *)modalHostView + withViewController:(RCTModalHostViewController *)viewController + animated:(BOOL)animated completion: (void (^)(void))completion; @end diff --git a/ios/Views/RCTModalHostViewImproved.mm b/ios/Views/RCTModalHostViewImproved.m similarity index 54% rename from ios/Views/RCTModalHostViewImproved.mm rename to ios/Views/RCTModalHostViewImproved.m index 96d3d21..b77b390 100644 --- a/ios/Views/RCTModalHostViewImproved.mm +++ b/ios/Views/RCTModalHostViewImproved.m @@ -11,7 +11,7 @@ #import "RCTAssert.h" #import "RCTBridge.h" -#import "RCTModalHostViewController.h" +#import "RCTModalHostViewControllerImproved.h" #import "RCTTouchHandler.h" #import "RCTUIManager.h" #import "RCTUtils.h" @@ -20,7 +20,7 @@ @implementation RCTModalHostViewImproved { __weak RCTBridge *_bridge; BOOL _isPresented; - RCTModalHostViewController *_modalViewController; + RCTModalHostViewControllerImproved *_modalViewController; RCTTouchHandler *_touchHandler; UIView *_reactSubview; UIInterfaceOrientation _lastKnownOrientation; @@ -32,10 +32,29 @@ @implementation RCTModalHostViewImproved { - (instancetype)initWithBridge:(RCTBridge *)bridge { - NSLog(@"RCTModalHostViewImproved init"); self = [super initWithBridge:bridge]; + _modalViewController.modalHostView = self; return self; } +- (void)dismissModalViewController +{ + [self dismissModalViewControllerWithCompletion: nil]; +} + +- (void)dismissModalViewControllerWithCompletion:(void (^)(void))completion +{ + if (_isPresented) { + [self.delegate dismissModalHostView:self withViewController:_modalViewController animated:[self hasAnimationType]]; + [self.delegate dismissModalHostViewWithCompletion:self withViewController:_modalViewController animated:[self hasAnimationType] completion: completion]; + _isPresented = NO; + } +} + +- (BOOL)hasAnimationType +{ + return ![self.animationType isEqualToString:@"none"]; +} + @end diff --git a/ios/Views/RCTModalHostViewImprovedManager.mm b/ios/Views/RCTModalHostViewImprovedManager.m similarity index 75% rename from ios/Views/RCTModalHostViewImprovedManager.mm rename to ios/Views/RCTModalHostViewImprovedManager.m index 4b210b1..c5416c2 100644 --- a/ios/Views/RCTModalHostViewImprovedManager.mm +++ b/ios/Views/RCTModalHostViewImprovedManager.m @@ -35,6 +35,13 @@ - (UIView *)view return view; } +- (void)dismissModalHostViewWithCompletion:(RCTModalHostView *)modalHostView + withViewController:(RCTModalHostViewController *)viewController + animated:(BOOL)animated completion:(void (^)(void))completion +{ + NSLog(@"dismissModalHostViewWithCompletion"); +} + /* Over-ride this method to add custom shadow view - (RCTShadowView *)shadowView { From 45e31a914b70ffdb17d28e47c21bb9a23f58289d Mon Sep 17 00:00:00 2001 From: Fabrizio Bertoglio Date: Thu, 25 Jan 2024 12:43:56 +0800 Subject: [PATCH 03/13] complete implementation of #31498 --- .../RCTModalHostViewControllerImproved.h | 4 +- ios/Views/RCTModalHostViewImproved.h | 4 +- ios/Views/RCTModalHostViewImproved.m | 2 - ios/Views/RCTModalHostViewImprovedManager.m | 73 ++++++++++++++++++- 4 files changed, 74 insertions(+), 9 deletions(-) diff --git a/ios/Views/RCTModalHostViewControllerImproved.h b/ios/Views/RCTModalHostViewControllerImproved.h index 3404390..2c39793 100644 --- a/ios/Views/RCTModalHostViewControllerImproved.h +++ b/ios/Views/RCTModalHostViewControllerImproved.h @@ -7,10 +7,10 @@ #import #import "RCTModalHostViewController.h" -#import "RCTModalHostView.h" +#import "RCTModalHostViewImproved.h" @interface RCTModalHostViewControllerImproved : RCTModalHostViewController -@property RCTModalHostView* modalHostView; +@property RCTModalHostViewImproved* modalHostView; @end diff --git a/ios/Views/RCTModalHostViewImproved.h b/ios/Views/RCTModalHostViewImproved.h index 9d831e8..18c332f 100644 --- a/ios/Views/RCTModalHostViewImproved.h +++ b/ios/Views/RCTModalHostViewImproved.h @@ -25,10 +25,10 @@ NS_ASSUME_NONNULL_BEGIN @protocol RCTModalHostViewInteractorImproved -- (void)dismissModalHostView:(RCTModalHostView *)modalHostView +- (void)dismissModalHostView:(RCTModalHostViewImproved *)modalHostView withViewController:(RCTModalHostViewController *)viewController animated:(BOOL)animated; -- (void)dismissModalHostViewWithCompletion:(RCTModalHostView *)modalHostView +- (void)dismissModalHostViewWithCompletion:(RCTModalHostViewImproved *)modalHostView withViewController:(RCTModalHostViewController *)viewController animated:(BOOL)animated completion: (void (^)(void))completion; diff --git a/ios/Views/RCTModalHostViewImproved.m b/ios/Views/RCTModalHostViewImproved.m index b77b390..59fd236 100644 --- a/ios/Views/RCTModalHostViewImproved.m +++ b/ios/Views/RCTModalHostViewImproved.m @@ -5,8 +5,6 @@ * LICENSE file in the root directory of this source tree. */ -#import "RCTModalHostViewImproved.h" - #import #import "RCTAssert.h" diff --git a/ios/Views/RCTModalHostViewImprovedManager.m b/ios/Views/RCTModalHostViewImprovedManager.m index c5416c2..4305146 100644 --- a/ios/Views/RCTModalHostViewImprovedManager.m +++ b/ios/Views/RCTModalHostViewImprovedManager.m @@ -6,8 +6,10 @@ */ #import "RCTModalHostViewImprovedManager.h" +#import "RCTModalHostViewControllerImproved.h" #import "RCTModalHostViewImproved.h" #import "RCTShadowView.h" +#import "RCTModalManager.h" @interface RCTModalHostShadowView : RCTShadowView @@ -35,11 +37,76 @@ - (UIView *)view return view; } -- (void)dismissModalHostViewWithCompletion:(RCTModalHostView *)modalHostView - withViewController:(RCTModalHostViewController *)viewController +- (void)presentModalHostView:(RCTModalHostViewImproved *)modalHostView + withViewController:(RCTModalHostViewController *)viewController + animated:(BOOL)animated +{ + dispatch_block_t completionBlock = ^{ + if (modalHostView.onShow) { + modalHostView.onShow(nil); + } + }; + dispatch_async(dispatch_get_main_queue(), ^{ + if (super.presentationBlock) { + super.presentationBlock([modalHostView reactViewController], viewController, animated, completionBlock); + } else { + UIViewController* presentingViewController; + // pageSheet and formSheet presentation style animate the presented view so we need to use the last presented view controller + // For other presentation styles we use the new window + if (modalHostView.presentationStyle == UIModalPresentationPageSheet || modalHostView.presentationStyle == UIModalPresentationFormSheet) { + UIViewController *lastPresentedViewController = RCTKeyWindow().rootViewController; + UIViewController *presentedViewController = nil; + while (lastPresentedViewController != nil) { + presentedViewController = lastPresentedViewController; + lastPresentedViewController = lastPresentedViewController.presentedViewController; + } + presentingViewController = presentedViewController; + } else { + modalHostView.modalWindow = [[UIWindow alloc] initWithFrame:UIScreen.mainScreen.bounds]; + modalHostView.modalWindow.windowLevel = UIWindowLevelAlert; + UIViewController *newViewController = [[UIViewController alloc] init]; + modalHostView.modalWindow.rootViewController = newViewController; + [modalHostView.modalWindow makeKeyAndVisible]; + presentingViewController = newViewController; + } + [presentingViewController presentViewController:viewController animated:animated completion:completionBlock]; + } + }); +} + + +- (void)dismissModalHostViewWithCompletion:(RCTModalHostViewImproved *)modalHostView + withViewController:(RCTModalHostViewControllerImproved *)viewController animated:(BOOL)animated completion:(void (^)(void))completion { - NSLog(@"dismissModalHostViewWithCompletion"); + dispatch_block_t completionBlock = ^{ + if (modalHostView.identifier) { + [[self.bridge moduleForClass:[RCTModalManager class]] modalDismissed:modalHostView.identifier]; + } + if (completion) { + completion(); + } + modalHostView.modalWindow = nil; + }; + dispatch_async(dispatch_get_main_queue(), ^{ + if (super.dismissalBlock) { + super.dismissalBlock([modalHostView reactViewController], viewController, animated, completionBlock); + } else { + // Will be true for pageSheet and formSheet presentation styles + // We dismiss the nested modal and then dismiss the current modal + if (viewController.presentedViewController != nil && [viewController.presentedViewController isKindOfClass:[RCTModalHostViewController class]]) { + RCTModalHostViewControllerImproved* presentedModalViewController = (RCTModalHostViewControllerImproved *)viewController.presentedViewController; + dispatch_block_t childModalCompletionBlock = ^{ + [viewController.presentingViewController dismissViewControllerAnimated:animated completion:completionBlock]; + }; + + + [presentedModalViewController.modalHostView dismissModalViewControllerWithCompletion: childModalCompletionBlock]; + } else { + [viewController.presentingViewController dismissViewControllerAnimated:animated completion:completionBlock]; + } + } + }); } /* Over-ride this method to add custom shadow view From 4f39a2c2be991893e8955b4e6efc750432b376ff Mon Sep 17 00:00:00 2001 From: Fabrizio Bertoglio Date: Thu, 25 Jan 2024 12:54:31 +0800 Subject: [PATCH 04/13] adding dismissModalHostView --- ios/Views/RCTModalHostViewImprovedManager.m | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/ios/Views/RCTModalHostViewImprovedManager.m b/ios/Views/RCTModalHostViewImprovedManager.m index 4305146..e27bc3b 100644 --- a/ios/Views/RCTModalHostViewImprovedManager.m +++ b/ios/Views/RCTModalHostViewImprovedManager.m @@ -109,11 +109,16 @@ - (void)dismissModalHostViewWithCompletion:(RCTModalHostViewImproved *)modalHost }); } -/* Over-ride this method to add custom shadow view -- (RCTShadowView *)shadowView +- (void)dismissModalHostView:(RCTModalHostView *)modalHostView + withViewController:(RCTModalHostViewController *)viewController + animated:(BOOL)animated { - return [RCTModalHostShadowView new]; + [self dismissModalHostViewWithCompletion:modalHostView withViewController:viewController animated:animated completion:nil]; } -*/ +// Over-ride this method to add custom shadow view +// - (RCTShadowView *)shadowView +// { +// return [RCTModalHostShadowView new]; +// } @end From c5f4d6833815647a693b72ed9f8441402861daff Mon Sep 17 00:00:00 2001 From: Fabrizio Bertoglio Date: Thu, 25 Jan 2024 13:57:23 +0800 Subject: [PATCH 05/13] minor changes --- ios/Views/RCTModalHostViewImproved.m | 1 - 1 file changed, 1 deletion(-) diff --git a/ios/Views/RCTModalHostViewImproved.m b/ios/Views/RCTModalHostViewImproved.m index 59fd236..be37c6e 100644 --- a/ios/Views/RCTModalHostViewImproved.m +++ b/ios/Views/RCTModalHostViewImproved.m @@ -44,7 +44,6 @@ - (void)dismissModalViewController - (void)dismissModalViewControllerWithCompletion:(void (^)(void))completion { if (_isPresented) { - [self.delegate dismissModalHostView:self withViewController:_modalViewController animated:[self hasAnimationType]]; [self.delegate dismissModalHostViewWithCompletion:self withViewController:_modalViewController animated:[self hasAnimationType] completion: completion]; _isPresented = NO; } From 637647059acb84b1110da72df4c5445c06be9f4b Mon Sep 17 00:00:00 2001 From: Fabrizio Bertoglio Date: Thu, 25 Jan 2024 16:31:13 +0800 Subject: [PATCH 06/13] fixing issue with modal not closing --- ios/Views/RCTModalHostViewImproved.h | 3 +++ ios/Views/RCTModalHostViewImproved.m | 29 ++++++++++++++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/ios/Views/RCTModalHostViewImproved.h b/ios/Views/RCTModalHostViewImproved.h index 18c332f..59d5f88 100644 --- a/ios/Views/RCTModalHostViewImproved.h +++ b/ios/Views/RCTModalHostViewImproved.h @@ -25,6 +25,9 @@ NS_ASSUME_NONNULL_BEGIN @protocol RCTModalHostViewInteractorImproved +- (void)presentModalHostView:(RCTModalHostView *)modalHostView + withViewController:(RCTModalHostViewController *)viewController + animated:(BOOL)animated; - (void)dismissModalHostView:(RCTModalHostViewImproved *)modalHostView withViewController:(RCTModalHostViewController *)viewController animated:(BOOL)animated; diff --git a/ios/Views/RCTModalHostViewImproved.m b/ios/Views/RCTModalHostViewImproved.m index be37c6e..62be52f 100644 --- a/ios/Views/RCTModalHostViewImproved.m +++ b/ios/Views/RCTModalHostViewImproved.m @@ -10,6 +10,7 @@ #import "RCTAssert.h" #import "RCTBridge.h" #import "RCTModalHostViewControllerImproved.h" +#import "RCTModalHostView.h" #import "RCTTouchHandler.h" #import "RCTUIManager.h" #import "RCTUtils.h" @@ -49,6 +50,34 @@ - (void)dismissModalViewControllerWithCompletion:(void (^)(void))completion } } + +- (void)setVisible:(BOOL)visible +{ + [super setVisible:visible]; + BOOL shouldBePresented = !_isPresented && self.visible && self.window; + if (shouldBePresented) { + _isPresented = YES; + } +} + +- (void)didMoveToWindow +{ + [super didMoveToWindow]; + BOOL shouldBePresented = !_isPresented && self.visible && self.window; + if (shouldBePresented) { + _isPresented = YES; + } +} + +- (void)didMoveToSuperview +{ + [super didMoveToSuperview]; + BOOL shouldBePresented = !_isPresented && self.visible && self.window; + if (shouldBePresented) { + _isPresented = YES; + } +} + - (BOOL)hasAnimationType { return ![self.animationType isEqualToString:@"none"]; From 7de9cb1f6d95ce148293e34cba56b457d98aefa4 Mon Sep 17 00:00:00 2001 From: Fabrizio Bertoglio Date: Thu, 25 Jan 2024 16:35:24 +0800 Subject: [PATCH 07/13] minor changes --- ios/Views/RCTModalHostViewImprovedManager.m | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/ios/Views/RCTModalHostViewImprovedManager.m b/ios/Views/RCTModalHostViewImprovedManager.m index e27bc3b..8d3090f 100644 --- a/ios/Views/RCTModalHostViewImprovedManager.m +++ b/ios/Views/RCTModalHostViewImprovedManager.m @@ -116,9 +116,13 @@ - (void)dismissModalHostView:(RCTModalHostView *)modalHostView [self dismissModalHostViewWithCompletion:modalHostView withViewController:viewController animated:animated completion:nil]; } -// Over-ride this method to add custom shadow view -// - (RCTShadowView *)shadowView -// { -// return [RCTModalHostShadowView new]; -// } +/** +Over-ride this method to add change the React Native Shadow View for this class. + +- (RCTShadowView *)shadowView +{ + return [RCTModalHostShadowViewImproved new]; +} +**/ + @end From 4032065cae24d08b150e3b9d8fc5f2403e7b47c4 Mon Sep 17 00:00:00 2001 From: Fabrizio Bertoglio Date: Fri, 26 Jan 2024 16:54:04 +0800 Subject: [PATCH 08/13] remove PR diff - modal opens and closes --- .../src/examples/Modal/ModalPresentation.js | 242 ++---------------- .../RCTModalHostViewControllerImproved.h | 2 - .../RCTModalHostViewControllerImproved.m | 35 +++ ios/Views/RCTModalHostViewImproved.m | 55 +--- ios/Views/RCTModalHostViewImprovedManager.m | 79 ------ 5 files changed, 66 insertions(+), 347 deletions(-) create mode 100644 ios/Views/RCTModalHostViewControllerImproved.m diff --git a/example/src/examples/Modal/ModalPresentation.js b/example/src/examples/Modal/ModalPresentation.js index 358da02..7d46167 100644 --- a/example/src/examples/Modal/ModalPresentation.js +++ b/example/src/examples/Modal/ModalPresentation.js @@ -11,9 +11,17 @@ /* eslint-disable no-alert */ import * as React from 'react'; -import {Modal, Platform, StyleSheet, Switch, Text, View} from 'react-native'; -import type {RNTesterModuleExample} from '../../types/RNTesterTypes'; -import type {Props as ModalProps} from 'react-native/Libraries/Modal/Modal'; +import { + Button, + Modal, + Platform, + StyleSheet, + Switch, + Text, + View, +} from 'react-native'; +import type { RNTesterModuleExample } from '../../types/RNTesterTypes'; +import type { Props as ModalProps } from 'react-native/Libraries/Modal/Modal'; import RNTOption from '../../components/RNTOption'; const RNTesterButton = require('../../components/RNTesterButton'); @@ -33,229 +41,17 @@ const supportedOrientations = [ ]; function ModalPresentation() { - const onDismiss = React.useCallback(() => { - alert('onDismiss'); - }, []); - - const onShow = React.useCallback(() => { - alert('onShow'); - }, []); - - const onRequestClose = React.useCallback(() => { - console.log('onRequestClose'); - }, []); - - const [props, setProps] = React.useState({ - animationType: 'none', - transparent: false, - hardwareAccelerated: false, - statusBarTranslucent: false, - presentationStyle: Platform.select({ - ios: 'fullScreen', - default: undefined, - }), - supportedOrientations: Platform.select({ - ios: ['portrait'], - default: undefined, - }), - onDismiss: undefined, - onShow: undefined, - visible: false, - }); - const presentationStyle = props.presentationStyle; - const hardwareAccelerated = props.hardwareAccelerated; - const statusBarTranslucent = props.statusBarTranslucent; - - const [currentOrientation, setCurrentOrientation] = React.useState('unknown'); - - /* $FlowFixMe[missing-local-annot] The type annotation(s) required by Flow's - * LTI update could not be added via codemod */ - const onOrientationChange = event => - setCurrentOrientation(event.nativeEvent.orientation); - - const controls = ( - <> - - Status Bar Translucent 🟢 - - setProps(prev => ({...prev, statusBarTranslucent: enabled})) - } - /> - - - Hardware Acceleration 🟢 - - setProps(prev => ({ - ...prev, - hardwareAccelerated: enabled, - })) - } - /> - - - Presentation Style ⚫️ - - {presentationStyles.map(type => ( - - setProps(prev => { - if (type === 'overFullScreen' && prev.transparent === true) { - return { - ...prev, - presentationStyle: type, - transparent: false, - }; - } - return { - ...prev, - presentationStyle: - type === prev.presentationStyle ? undefined : type, - }; - }) - } - selected={type === presentationStyle} - /> - ))} - - - - - Transparent - - setProps(prev => ({...prev, transparent: enabled})) - } - /> - - {Platform.OS === 'ios' && presentationStyle !== 'overFullScreen' ? ( - - iOS Modal can only be transparent with 'overFullScreen' Presentation - Style - - ) : null} - - - Supported Orientation ⚫️ - - {supportedOrientations.map(orientation => ( - - setProps(prev => { - if (prev.supportedOrientations?.includes(orientation)) { - return { - ...prev, - supportedOrientations: prev.supportedOrientations?.filter( - o => o !== orientation, - ), - }; - } - return { - ...prev, - supportedOrientations: [ - ...(prev.supportedOrientations ?? []), - orientation, - ], - }; - }) - } - selected={props.supportedOrientations?.includes(orientation)} - /> - ))} - - - - Actions - - - setProps(prev => ({ - ...prev, - onShow: prev.onShow ? undefined : onShow, - })) - } - selected={!!props.onShow} - /> - - setProps(prev => ({ - ...prev, - onDismiss: prev.onDismiss ? undefined : onDismiss, - })) - } - selected={!!props.onDismiss} - /> - - - - ); - + const [firstModalVisible, setFirstModalVisible] = React.useState(true); + const [secondModalVisible, setSecondModalVisible] = React.useState(true); return ( - setProps(prev => ({...prev, visible: true}))}> - Show Modal - - - - - - This modal was presented with animationType: ' - {props.animationType}' - - {Platform.OS === 'ios' ? ( - - It is currently displayed in {currentOrientation} mode. - - ) : null} - setProps(prev => ({...prev, visible: false}))}> - Close - - {controls} - - + + This is first modal +