react-native-screens 3.11.1 → 3.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (88) hide show
  1. package/README.md +4 -0
  2. package/RNScreens.podspec +36 -6
  3. package/android/build.gradle +73 -1
  4. package/android/src/fabric/java/com/swmansion/rnscreens/FabricEnabledViewGroup.kt +49 -0
  5. package/android/src/fabric/java/com/swmansion/rnscreens/RNScreensComponentsRegistry.java +28 -0
  6. package/android/src/main/java/com/swmansion/rnscreens/RNScreensPackage.kt +11 -2
  7. package/android/src/main/java/com/swmansion/rnscreens/Screen.kt +24 -10
  8. package/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderConfigViewManager.kt +83 -18
  9. package/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderSubviewManager.kt +17 -5
  10. package/android/src/main/java/com/swmansion/rnscreens/ScreenStackViewManager.kt +14 -1
  11. package/android/src/main/java/com/swmansion/rnscreens/ScreenViewManager.kt +33 -16
  12. package/android/src/main/jni/Android.mk +45 -0
  13. package/android/src/main/jni/OnLoad.cpp +9 -0
  14. package/android/src/main/jni/RNScreensComponentsRegistry.cpp +66 -0
  15. package/android/src/main/jni/RNScreensComponentsRegistry.h +34 -0
  16. package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenManagerDelegate.java +71 -0
  17. package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenManagerInterface.java +30 -0
  18. package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenStackHeaderConfigManagerDelegate.java +104 -0
  19. package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenStackHeaderConfigManagerInterface.java +41 -0
  20. package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenStackHeaderSubviewManagerDelegate.java +31 -0
  21. package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenStackHeaderSubviewManagerInterface.java +17 -0
  22. package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenStackManagerDelegate.java +25 -0
  23. package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenStackManagerInterface.java +16 -0
  24. package/android/src/paper/java/com/swmansion/rnscreens/FabricEnabledViewGroup.kt +16 -0
  25. package/common/cpp/Android.mk +38 -0
  26. package/common/cpp/rnscreens/RNSScreenComponentDescriptor.h +41 -0
  27. package/common/cpp/rnscreens/RNSScreenShadowNode.cpp +9 -0
  28. package/common/cpp/rnscreens/RNSScreenShadowNode.h +29 -0
  29. package/common/cpp/rnscreens/RNSScreenState.cpp +14 -0
  30. package/common/cpp/rnscreens/RNSScreenState.h +46 -0
  31. package/ios/RNSScreenComponentView.h +23 -0
  32. package/ios/RNSScreenComponentView.mm +159 -0
  33. package/ios/RNSScreenController.h +10 -0
  34. package/ios/RNSScreenController.mm +79 -0
  35. package/ios/RNSScreenStackComponentView.h +15 -0
  36. package/ios/RNSScreenStackComponentView.mm +295 -0
  37. package/ios/RNSScreenStackHeaderConfigComponentView.h +42 -0
  38. package/ios/RNSScreenStackHeaderConfigComponentView.mm +662 -0
  39. package/ios/RNSScreenStackHeaderSubviewComponentView.h +14 -0
  40. package/ios/RNSScreenStackHeaderSubviewComponentView.mm +77 -0
  41. package/ios/utils/RNSUIBarButtonItem.h +5 -0
  42. package/ios/utils/RNSUIBarButtonItem.mm +22 -0
  43. package/lib/commonjs/fabric/Screen.js +27 -0
  44. package/lib/commonjs/fabric/Screen.js.map +1 -0
  45. package/lib/commonjs/fabric/ScreenNativeComponent.js +23 -0
  46. package/lib/commonjs/fabric/ScreenNativeComponent.js.map +1 -0
  47. package/lib/commonjs/fabric/ScreenStack.js +27 -0
  48. package/lib/commonjs/fabric/ScreenStack.js.map +1 -0
  49. package/lib/commonjs/fabric/ScreenStackHeaderConfigNativeComponent.js +27 -0
  50. package/lib/commonjs/fabric/ScreenStackHeaderConfigNativeComponent.js.map +1 -0
  51. package/lib/commonjs/fabric/ScreenStackHeaderSubview.js +34 -0
  52. package/lib/commonjs/fabric/ScreenStackHeaderSubview.js.map +1 -0
  53. package/lib/commonjs/fabric/ScreenStackHeaderSubviewNativeComponent.js +27 -0
  54. package/lib/commonjs/fabric/ScreenStackHeaderSubviewNativeComponent.js.map +1 -0
  55. package/lib/commonjs/fabric/ScreenStackNativeComponent.js +21 -0
  56. package/lib/commonjs/fabric/ScreenStackNativeComponent.js.map +1 -0
  57. package/lib/commonjs/fabric/index.js +40 -0
  58. package/lib/commonjs/fabric/index.js.map +1 -0
  59. package/lib/commonjs/index.native.js +32 -15
  60. package/lib/commonjs/index.native.js.map +1 -1
  61. package/lib/module/fabric/Screen.js +11 -0
  62. package/lib/module/fabric/Screen.js.map +1 -0
  63. package/lib/module/fabric/ScreenNativeComponent.js +11 -0
  64. package/lib/module/fabric/ScreenNativeComponent.js.map +1 -0
  65. package/lib/module/fabric/ScreenStack.js +12 -0
  66. package/lib/module/fabric/ScreenStack.js.map +1 -0
  67. package/lib/module/fabric/ScreenStackHeaderConfigNativeComponent.js +10 -0
  68. package/lib/module/fabric/ScreenStackHeaderConfigNativeComponent.js.map +1 -0
  69. package/lib/module/fabric/ScreenStackHeaderSubview.js +21 -0
  70. package/lib/module/fabric/ScreenStackHeaderSubview.js.map +1 -0
  71. package/lib/module/fabric/ScreenStackHeaderSubviewNativeComponent.js +10 -0
  72. package/lib/module/fabric/ScreenStackHeaderSubviewNativeComponent.js.map +1 -0
  73. package/lib/module/fabric/ScreenStackNativeComponent.js +9 -0
  74. package/lib/module/fabric/ScreenStackNativeComponent.js.map +1 -0
  75. package/lib/module/fabric/index.js +6 -0
  76. package/lib/module/fabric/index.js.map +1 -0
  77. package/lib/module/index.native.js +32 -15
  78. package/lib/module/index.native.js.map +1 -1
  79. package/package.json +17 -3
  80. package/src/fabric/Screen.js +12 -0
  81. package/src/fabric/ScreenNativeComponent.js +64 -0
  82. package/src/fabric/ScreenStack.js +8 -0
  83. package/src/fabric/ScreenStackHeaderConfigNativeComponent.js +54 -0
  84. package/src/fabric/ScreenStackHeaderSubview.js +20 -0
  85. package/src/fabric/ScreenStackHeaderSubviewNativeComponent.js +31 -0
  86. package/src/fabric/ScreenStackNativeComponent.js +19 -0
  87. package/src/fabric/index.js +11 -0
  88. package/src/index.native.tsx +35 -14
@@ -0,0 +1,38 @@
1
+ SCREENS_COMMON_THIS_DIR := $(call my-dir)
2
+
3
+ include $(CLEAR_VARS)
4
+
5
+ LOCAL_PATH := $(SCREENS_COMMON_THIS_DIR)
6
+ LOCAL_MODULE := rnscreens_common
7
+
8
+ LOCAL_C_INCLUDES := $(LOCAL_PATH) $(GENERATED_SRC_DIR)/codegen/jni
9
+ LOCAL_SRC_FILES := $(wildcard $(LOCAL_PATH)/**/*.cpp)
10
+ LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH) $(GENERATED_SRC_DIR)/codegen/jni
11
+
12
+ # Please note as one of the library listed is libreact_codegen_samplelibrary
13
+ # This name will be generated as libreact_codegen_<library-name>
14
+ # where <library-name> is the one you specified in the Gradle configuration
15
+ LOCAL_SHARED_LIBRARIES := libjsi \
16
+ libfbjni \
17
+ libglog \
18
+ libfolly_json \
19
+ libyoga \
20
+ libreact_nativemodule_core \
21
+ libturbomodulejsijni \
22
+ librrc_view \
23
+ libreact_render_core \
24
+ libreact_render_graphics \
25
+ libfabricjni \
26
+ libfolly_futures \
27
+ libreact_debug \
28
+ libreact_render_componentregistry \
29
+ libreact_render_debug \
30
+ libruntimeexecutor \
31
+ libreact_codegen_rncore \
32
+ libreact_codegen_rnscreens
33
+
34
+ LOCAL_CFLAGS := \
35
+ -DLOG_TAG=\"ReactNative\"
36
+ LOCAL_CFLAGS += -fexceptions -frtti -std=c++17 -Wall
37
+
38
+ include $(BUILD_SHARED_LIBRARY)
@@ -0,0 +1,41 @@
1
+ #pragma once
2
+
3
+ #include <react/debug/react_native_assert.h>
4
+ #include "RNSScreenShadowNode.h"
5
+ #include <react/renderer/core/ConcreteComponentDescriptor.h>
6
+
7
+ namespace facebook {
8
+ namespace react {
9
+
10
+ class RNSScreenComponentDescriptor final
11
+ : public ConcreteComponentDescriptor<RNSScreenShadowNode> {
12
+ public:
13
+ using ConcreteComponentDescriptor::ConcreteComponentDescriptor;
14
+
15
+ void adopt(ShadowNode::Unshared const &shadowNode) const override {
16
+ react_native_assert(
17
+ std::dynamic_pointer_cast<RNSScreenShadowNode>(shadowNode));
18
+ auto screenShadowNode =
19
+ std::static_pointer_cast<RNSScreenShadowNode>(shadowNode);
20
+
21
+ react_native_assert(
22
+ std::dynamic_pointer_cast<YogaLayoutableShadowNode>(screenShadowNode));
23
+ auto layoutableShadowNode =
24
+ std::static_pointer_cast<YogaLayoutableShadowNode>(screenShadowNode);
25
+
26
+ auto state =
27
+ std::static_pointer_cast<const RNSScreenShadowNode::ConcreteState>(
28
+ shadowNode->getState());
29
+ auto stateData = state->getData();
30
+
31
+ if (stateData.frameSize.width != 0 && stateData.frameSize.height != 0) {
32
+ layoutableShadowNode->setSize(
33
+ Size{stateData.frameSize.width, stateData.frameSize.height});
34
+ }
35
+
36
+ ConcreteComponentDescriptor::adopt(shadowNode);
37
+ }
38
+ };
39
+
40
+ } // namespace react
41
+ } // namespace facebook
@@ -0,0 +1,9 @@
1
+ #include "RNSScreenShadowNode.h"
2
+
3
+ namespace facebook {
4
+ namespace react {
5
+
6
+ extern const char RNSScreenComponentName[] = "RNSScreen";
7
+
8
+ } // namespace react
9
+ } // namespace facebook
@@ -0,0 +1,29 @@
1
+ #pragma once
2
+
3
+ #include "RNSScreenState.h"
4
+ #include <react/renderer/components/rnscreens/EventEmitters.h>
5
+ #include <react/renderer/components/rnscreens/Props.h>
6
+ #include <react/renderer/components/view/ConcreteViewShadowNode.h>
7
+
8
+ namespace facebook {
9
+ namespace react {
10
+
11
+ extern const char RNSScreenComponentName[];
12
+
13
+ class RNSScreenShadowNode final : public ConcreteViewShadowNode<
14
+ RNSScreenComponentName,
15
+ RNSScreenProps,
16
+ RNSScreenEventEmitter,
17
+ RNSScreenState> {
18
+ public:
19
+ using ConcreteViewShadowNode::ConcreteViewShadowNode;
20
+
21
+ static ShadowNodeTraits BaseTraits() {
22
+ auto traits = ConcreteViewShadowNode::BaseTraits();
23
+ traits.set(ShadowNodeTraits::Trait::RootNodeKind);
24
+ return traits;
25
+ }
26
+ };
27
+
28
+ } // namespace react
29
+ } // namespace facebook
@@ -0,0 +1,14 @@
1
+ #include "RNSScreenState.h"
2
+
3
+ namespace facebook {
4
+ namespace react {
5
+
6
+ #ifdef ANDROID
7
+ folly::dynamic RNSScreenState::getDynamic() const {
8
+ return folly::dynamic::object("frameWidth", frameSize.width)(
9
+ "frameHeight", frameSize.height);
10
+ }
11
+ #endif
12
+
13
+ } // namespace react
14
+ } // namespace facebook
@@ -0,0 +1,46 @@
1
+ #pragma once
2
+
3
+ #include <react/renderer/graphics/Float.h>
4
+ #include <react/renderer/graphics/Geometry.h>
5
+ #include <react/renderer/graphics/conversions.h>
6
+
7
+ #ifdef ANDROID
8
+ #include <folly/dynamic.h>
9
+ #include <react/renderer/mapbuffer/MapBuffer.h>
10
+ #include <react/renderer/mapbuffer/MapBufferBuilder.h>
11
+ #endif
12
+
13
+ namespace facebook {
14
+ namespace react {
15
+
16
+ class RNSScreenState final {
17
+ public:
18
+ using Shared = std::shared_ptr<const RNSScreenState>;
19
+
20
+ RNSScreenState(){};
21
+ RNSScreenState(Size frameSize_) : frameSize(frameSize_){};
22
+
23
+ #ifdef ANDROID
24
+ RNSScreenState(
25
+ RNSScreenState const &previousState,
26
+ folly::dynamic data)
27
+ : frameSize(Size{
28
+ (Float)data["frameWidth"].getDouble(),
29
+ (Float)data["frameHeight"].getDouble()}){};
30
+ #endif
31
+
32
+ const Size frameSize{};
33
+
34
+ #ifdef ANDROID
35
+ folly::dynamic getDynamic() const;
36
+ MapBuffer getMapBuffer() const {
37
+ return MapBufferBuilder::EMPTY();
38
+ };
39
+
40
+ #endif
41
+
42
+ #pragma mark - Getters
43
+ };
44
+
45
+ } // namespace react
46
+ } // namespace facebook
@@ -0,0 +1,23 @@
1
+ #import <UIKit/UIKit.h>
2
+
3
+ #import <React/RCTViewComponentView.h>
4
+ #import "RNSScreenController.h"
5
+
6
+ NS_ASSUME_NONNULL_BEGIN
7
+
8
+ @interface RNSScreenComponentView : RCTViewComponentView
9
+
10
+ @property (weak, nonatomic) UIView *reactSuperview;
11
+ @property (weak, nonatomic) UIView *config;
12
+ @property (nonatomic, retain) RNSScreenController *controller;
13
+
14
+ - (void)notifyWillAppear;
15
+ - (void)notifyWillDisappear;
16
+ - (void)notifyAppear;
17
+ - (void)notifyDisappear;
18
+ - (void)updateBounds;
19
+ - (void)notifyDismissedWithCount:(int)dismissCount;
20
+
21
+ @end
22
+
23
+ NS_ASSUME_NONNULL_END
@@ -0,0 +1,159 @@
1
+ #import "RNSScreenComponentView.h"
2
+ #import "RNSScreenStackHeaderConfigComponentView.h"
3
+
4
+ #import <React/RCTConversions.h>
5
+ #import <React/RCTMountingTransactionObserving.h>
6
+
7
+ #import <react/renderer/components/rnscreens/EventEmitters.h>
8
+ #import <react/renderer/components/rnscreens/Props.h>
9
+ #import <react/renderer/components/rnscreens/RCTComponentViewHelpers.h>
10
+ #import <rnscreens/RNSScreenComponentDescriptor.h>
11
+
12
+ #import "RCTFabricComponentsPlugins.h"
13
+
14
+ using namespace facebook::react;
15
+
16
+ @interface RNSScreenComponentView () <RCTRNSScreenViewProtocol, RCTMountingTransactionObserving>
17
+ @end
18
+
19
+ @implementation RNSScreenComponentView {
20
+ RNSScreenController *_controller;
21
+ RNSScreenShadowNode::ConcreteState::Shared _state;
22
+ }
23
+
24
+ - (instancetype)initWithFrame:(CGRect)frame
25
+ {
26
+ if (self = [super initWithFrame:frame]) {
27
+ static const auto defaultProps = std::make_shared<const RNSScreenProps>();
28
+ _props = defaultProps;
29
+ _controller = [[RNSScreenController alloc] initWithView:self];
30
+ }
31
+
32
+ return self;
33
+ }
34
+
35
+ - (void)mountChildComponentView:(UIView<RCTComponentViewProtocol> *)childComponentView index:(NSInteger)index
36
+ {
37
+ [super mountChildComponentView:childComponentView index:index];
38
+ if ([childComponentView isKindOfClass:[RNSScreenStackHeaderConfigComponentView class]]) {
39
+ _config = childComponentView;
40
+ ((RNSScreenStackHeaderConfigComponentView *)childComponentView).screenView = self;
41
+ }
42
+ }
43
+
44
+ - (void)unmountChildComponentView:(UIView<RCTComponentViewProtocol> *)childComponentView index:(NSInteger)index
45
+ {
46
+ [self.controller setViewToSnapshot];
47
+ if ([childComponentView isKindOfClass:[RNSScreenStackHeaderConfigComponentView class]]) {
48
+ _config = nil;
49
+ }
50
+ [super unmountChildComponentView:childComponentView index:index];
51
+ }
52
+
53
+ - (void)updateBounds
54
+ {
55
+ if (_state != nullptr) {
56
+ auto boundsSize = self.bounds.size;
57
+ auto newState = RNSScreenState{RCTSizeFromCGSize(boundsSize)};
58
+ _state->updateState(std::move(newState));
59
+ UINavigationController *navctr = _controller.navigationController;
60
+ [navctr.view setNeedsLayout];
61
+ }
62
+ }
63
+
64
+ - (UIView *)reactSuperview
65
+ {
66
+ return _reactSuperview;
67
+ }
68
+
69
+ - (void)notifyWillAppear
70
+ {
71
+ // If screen is already unmounted then there will be no event emitter
72
+ // it will be cleaned in prepareForRecycle
73
+ if (_eventEmitter != nullptr) {
74
+ std::dynamic_pointer_cast<const RNSScreenEventEmitter>(_eventEmitter)
75
+ ->onWillAppear(RNSScreenEventEmitter::OnWillAppear{});
76
+ }
77
+ }
78
+
79
+ - (void)notifyWillDisappear
80
+ {
81
+ // If screen is already unmounted then there will be no event emitter
82
+ // it will be cleaned in prepareForRecycle
83
+ if (_eventEmitter != nullptr) {
84
+ std::dynamic_pointer_cast<const RNSScreenEventEmitter>(_eventEmitter)
85
+ ->onWillDisappear(RNSScreenEventEmitter::OnWillDisappear{});
86
+ }
87
+ }
88
+
89
+ - (void)notifyAppear
90
+ {
91
+ // If screen is already unmounted then there will be no event emitter
92
+ // it will be cleaned in prepareForRecycle
93
+ if (_eventEmitter != nullptr) {
94
+ std::dynamic_pointer_cast<const RNSScreenEventEmitter>(_eventEmitter)->onAppear(RNSScreenEventEmitter::OnAppear{});
95
+ }
96
+ }
97
+
98
+ - (void)notifyDismissedWithCount:(int)dismissCount
99
+ {
100
+ // If screen is already unmounted then there will be no event emitter
101
+ // it will be cleaned in prepareForRecycle
102
+ if (_eventEmitter != nullptr) {
103
+ std::dynamic_pointer_cast<const RNSScreenEventEmitter>(_eventEmitter)
104
+ ->onDismissed(RNSScreenEventEmitter::OnDismissed{dismissCount : dismissCount});
105
+ }
106
+ }
107
+
108
+ - (void)notifyDisappear
109
+ {
110
+ // If screen is already unmounted then there will be no event emitter
111
+ // it will be cleaned in prepareForRecycle
112
+ if (_eventEmitter != nullptr) {
113
+ std::dynamic_pointer_cast<const RNSScreenEventEmitter>(_eventEmitter)
114
+ ->onDisappear(RNSScreenEventEmitter::OnDisappear{});
115
+ }
116
+ }
117
+
118
+ #pragma mark - RCTMountingTransactionObserving
119
+
120
+ - (void)mountingTransactionWillMountWithMetadata:(MountingTransactionMetadata const &)metadata
121
+ {
122
+ [self.controller takeSnapshot];
123
+ }
124
+
125
+ #pragma mark - RCTComponentViewProtocol
126
+
127
+ - (void)prepareForRecycle
128
+ {
129
+ [super prepareForRecycle];
130
+ // TODO: Make sure that there is no edge case when this should be uncommented
131
+ // _controller=nil;
132
+ _state.reset();
133
+ }
134
+
135
+ + (ComponentDescriptorProvider)componentDescriptorProvider
136
+ {
137
+ return concreteComponentDescriptorProvider<RNSScreenComponentDescriptor>();
138
+ }
139
+
140
+ - (void)updateProps:(Props::Shared const &)props oldProps:(Props::Shared const &)oldProps
141
+ {
142
+ const auto &oldScreenProps = *std::static_pointer_cast<const RNSScreenProps>(_props);
143
+ const auto &newScreenProps = *std::static_pointer_cast<const RNSScreenProps>(props);
144
+
145
+ [super updateProps:props oldProps:oldProps];
146
+ }
147
+
148
+ - (void)updateState:(facebook::react::State::Shared const &)state
149
+ oldState:(facebook::react::State::Shared const &)oldState
150
+ {
151
+ _state = std::static_pointer_cast<const RNSScreenShadowNode::ConcreteState>(state);
152
+ }
153
+
154
+ @end
155
+
156
+ Class<RCTComponentViewProtocol> RNSScreenCls(void)
157
+ {
158
+ return RNSScreenComponentView.class;
159
+ }
@@ -0,0 +1,10 @@
1
+ #import <UIKit/UIKit.h>
2
+
3
+ @interface RNSScreenController : UIViewController
4
+
5
+ - (instancetype)initWithView:(UIView *)view;
6
+ - (void)takeSnapshot;
7
+ - (void)setViewToSnapshot;
8
+ - (void)resetViewToScreen;
9
+
10
+ @end
@@ -0,0 +1,79 @@
1
+ #import <react/renderer/components/rnscreens/RCTComponentViewHelpers.h>
2
+ #import "RNSScreenComponentView.h"
3
+
4
+ @implementation RNSScreenController {
5
+ CGRect _lastViewFrame;
6
+ RNSScreenComponentView *_initialView;
7
+ UIView *_snapshot;
8
+ }
9
+
10
+ - (instancetype)initWithView:(UIView *)view
11
+ {
12
+ if (self = [super init]) {
13
+ self.view = view;
14
+ if ([view isKindOfClass:[RNSScreenComponentView class]]) {
15
+ _initialView = (RNSScreenComponentView *)view;
16
+ } else {
17
+ RCTLogError(@"ScreenController can only be initialized with ScreenComponentView");
18
+ }
19
+ }
20
+ return self;
21
+ }
22
+
23
+ - (void)takeSnapshot
24
+ {
25
+ _snapshot = [self.view snapshotViewAfterScreenUpdates:NO];
26
+ }
27
+
28
+ - (void)setViewToSnapshot
29
+ {
30
+ [self.view removeFromSuperview];
31
+ self.view = _snapshot;
32
+ }
33
+
34
+ - (void)resetViewToScreen
35
+ {
36
+ [self.view removeFromSuperview];
37
+ self.view = _initialView;
38
+ }
39
+
40
+ // TODO: Find out why this is executed when screen is going out
41
+ - (void)viewWillAppear:(BOOL)animated
42
+ {
43
+ [super viewWillAppear:animated];
44
+ [_initialView notifyWillAppear];
45
+ }
46
+
47
+ - (void)viewWillDisappear:(BOOL)animated
48
+ {
49
+ [super viewWillDisappear:animated];
50
+ [_initialView notifyWillDisappear];
51
+ }
52
+
53
+ - (void)viewDidAppear:(BOOL)animated
54
+ {
55
+ [super viewDidAppear:animated];
56
+ [_initialView notifyAppear];
57
+ }
58
+
59
+ - (void)viewDidDisappear:(BOOL)animated
60
+ {
61
+ [super viewDidDisappear:animated];
62
+ [_initialView notifyDisappear];
63
+ if (self.parentViewController == nil && self.presentingViewController == nil) {
64
+ // screen dismissed, send event
65
+ [_initialView notifyDismissedWithCount:1];
66
+ }
67
+ }
68
+
69
+ - (void)viewDidLayoutSubviews
70
+ {
71
+ [super viewDidLayoutSubviews];
72
+ BOOL isDisplayedWithinUINavController = [self.parentViewController isKindOfClass:[UINavigationController class]];
73
+ if (isDisplayedWithinUINavController && !CGRectEqualToRect(_lastViewFrame, self.view.frame)) {
74
+ _lastViewFrame = self.view.frame;
75
+ [_initialView updateBounds];
76
+ }
77
+ }
78
+
79
+ @end
@@ -0,0 +1,15 @@
1
+ #import <UIKit/UIKit.h>
2
+
3
+ #import <React/RCTViewComponentView.h>
4
+
5
+ NS_ASSUME_NONNULL_BEGIN
6
+
7
+ @interface RNSScreenStackComponentView : RCTViewComponentView
8
+
9
+ @end
10
+
11
+ @interface RNSScreenStackView : UIView
12
+ - (instancetype)initWithComponentView:(RNSScreenStackComponentView *)component;
13
+ @end
14
+
15
+ NS_ASSUME_NONNULL_END