RCTModalHostViewManager.m 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. /*
  2. * Copyright (c) Facebook, Inc. and its affiliates.
  3. *
  4. * This source code is licensed under the MIT license found in the
  5. * LICENSE file in the root directory of this source tree.
  6. */
  7. #import "RCTModalHostViewManager.h"
  8. #import "RCTBridge.h"
  9. #import "RCTModalHostView.h"
  10. #import "RCTModalHostViewController.h"
  11. #import "RCTShadowView.h"
  12. #import "RCTUtils.h"
  13. @implementation RCTConvert (RCTModalHostView)
  14. RCT_ENUM_CONVERTER(
  15. UIModalPresentationStyle,
  16. (@{
  17. @"fullScreen" : @(UIModalPresentationFullScreen),
  18. #if !TARGET_OS_TV
  19. @"pageSheet" : @(UIModalPresentationPageSheet),
  20. @"formSheet" : @(UIModalPresentationFormSheet),
  21. #endif
  22. @"overFullScreen" : @(UIModalPresentationOverFullScreen),
  23. }),
  24. UIModalPresentationFullScreen,
  25. integerValue)
  26. @end
  27. @interface RCTModalHostShadowView : RCTShadowView
  28. @end
  29. @implementation RCTModalHostShadowView
  30. - (void)insertReactSubview:(id<RCTComponent>)subview atIndex:(NSInteger)atIndex
  31. {
  32. [super insertReactSubview:subview atIndex:atIndex];
  33. if ([subview isKindOfClass:[RCTShadowView class]]) {
  34. ((RCTShadowView *)subview).size = RCTScreenSize();
  35. }
  36. }
  37. @end
  38. @interface RCTModalHostViewManager () <RCTModalHostViewInteractor>
  39. @end
  40. @implementation RCTModalHostViewManager {
  41. NSPointerArray *_hostViews;
  42. }
  43. RCT_EXPORT_MODULE()
  44. - (UIView *)view
  45. {
  46. RCTModalHostView *view = [[RCTModalHostView alloc] initWithBridge:self.bridge];
  47. view.delegate = self;
  48. if (!_hostViews) {
  49. _hostViews = [NSPointerArray weakObjectsPointerArray];
  50. }
  51. [_hostViews addPointer:(__bridge void *)view];
  52. return view;
  53. }
  54. - (void)presentModalHostView:(RCTModalHostView *)modalHostView
  55. withViewController:(RCTModalHostViewController *)viewController
  56. animated:(BOOL)animated
  57. {
  58. dispatch_block_t completionBlock = ^{
  59. if (modalHostView.onShow) {
  60. modalHostView.onShow(nil);
  61. }
  62. };
  63. if (_presentationBlock) {
  64. _presentationBlock([modalHostView reactViewController], viewController, animated, completionBlock);
  65. } else {
  66. [[modalHostView reactViewController] presentViewController:viewController
  67. animated:animated
  68. completion:completionBlock];
  69. }
  70. }
  71. - (void)dismissModalHostView:(RCTModalHostView *)modalHostView
  72. withViewController:(RCTModalHostViewController *)viewController
  73. animated:(BOOL)animated
  74. {
  75. if (_dismissalBlock) {
  76. _dismissalBlock([modalHostView reactViewController], viewController, animated, nil);
  77. } else {
  78. [viewController.presentingViewController dismissViewControllerAnimated:animated completion:nil];
  79. }
  80. }
  81. - (RCTShadowView *)shadowView
  82. {
  83. return [RCTModalHostShadowView new];
  84. }
  85. - (void)invalidate
  86. {
  87. for (RCTModalHostView *hostView in _hostViews) {
  88. [hostView invalidate];
  89. }
  90. _hostViews = nil;
  91. }
  92. RCT_EXPORT_VIEW_PROPERTY(animationType, NSString)
  93. RCT_EXPORT_VIEW_PROPERTY(presentationStyle, UIModalPresentationStyle)
  94. RCT_EXPORT_VIEW_PROPERTY(transparent, BOOL)
  95. RCT_EXPORT_VIEW_PROPERTY(onShow, RCTDirectEventBlock)
  96. RCT_EXPORT_VIEW_PROPERTY(identifier, NSNumber)
  97. RCT_EXPORT_VIEW_PROPERTY(supportedOrientations, NSArray)
  98. RCT_EXPORT_VIEW_PROPERTY(onOrientationChange, RCTDirectEventBlock)
  99. #if TARGET_OS_TV
  100. RCT_EXPORT_VIEW_PROPERTY(onRequestClose, RCTDirectEventBlock)
  101. #endif
  102. @end