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.
- package/README.md +4 -0
- package/RNScreens.podspec +36 -6
- package/android/build.gradle +73 -1
- package/android/src/fabric/java/com/swmansion/rnscreens/FabricEnabledViewGroup.kt +49 -0
- package/android/src/fabric/java/com/swmansion/rnscreens/RNScreensComponentsRegistry.java +28 -0
- package/android/src/main/java/com/swmansion/rnscreens/RNScreensPackage.kt +11 -2
- package/android/src/main/java/com/swmansion/rnscreens/Screen.kt +24 -10
- package/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderConfigViewManager.kt +83 -18
- package/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderSubviewManager.kt +17 -5
- package/android/src/main/java/com/swmansion/rnscreens/ScreenStackViewManager.kt +14 -1
- package/android/src/main/java/com/swmansion/rnscreens/ScreenViewManager.kt +33 -16
- package/android/src/main/jni/Android.mk +45 -0
- package/android/src/main/jni/OnLoad.cpp +9 -0
- package/android/src/main/jni/RNScreensComponentsRegistry.cpp +66 -0
- package/android/src/main/jni/RNScreensComponentsRegistry.h +34 -0
- package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenManagerDelegate.java +71 -0
- package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenManagerInterface.java +30 -0
- package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenStackHeaderConfigManagerDelegate.java +104 -0
- package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenStackHeaderConfigManagerInterface.java +41 -0
- package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenStackHeaderSubviewManagerDelegate.java +31 -0
- package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenStackHeaderSubviewManagerInterface.java +17 -0
- package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenStackManagerDelegate.java +25 -0
- package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenStackManagerInterface.java +16 -0
- package/android/src/paper/java/com/swmansion/rnscreens/FabricEnabledViewGroup.kt +16 -0
- package/common/cpp/Android.mk +38 -0
- package/common/cpp/rnscreens/RNSScreenComponentDescriptor.h +41 -0
- package/common/cpp/rnscreens/RNSScreenShadowNode.cpp +9 -0
- package/common/cpp/rnscreens/RNSScreenShadowNode.h +29 -0
- package/common/cpp/rnscreens/RNSScreenState.cpp +14 -0
- package/common/cpp/rnscreens/RNSScreenState.h +46 -0
- package/ios/RNSScreenComponentView.h +23 -0
- package/ios/RNSScreenComponentView.mm +159 -0
- package/ios/RNSScreenController.h +10 -0
- package/ios/RNSScreenController.mm +79 -0
- package/ios/RNSScreenStackComponentView.h +15 -0
- package/ios/RNSScreenStackComponentView.mm +295 -0
- package/ios/RNSScreenStackHeaderConfigComponentView.h +42 -0
- package/ios/RNSScreenStackHeaderConfigComponentView.mm +662 -0
- package/ios/RNSScreenStackHeaderSubviewComponentView.h +14 -0
- package/ios/RNSScreenStackHeaderSubviewComponentView.mm +77 -0
- package/ios/utils/RNSUIBarButtonItem.h +5 -0
- package/ios/utils/RNSUIBarButtonItem.mm +22 -0
- package/lib/commonjs/fabric/Screen.js +27 -0
- package/lib/commonjs/fabric/Screen.js.map +1 -0
- package/lib/commonjs/fabric/ScreenNativeComponent.js +23 -0
- package/lib/commonjs/fabric/ScreenNativeComponent.js.map +1 -0
- package/lib/commonjs/fabric/ScreenStack.js +27 -0
- package/lib/commonjs/fabric/ScreenStack.js.map +1 -0
- package/lib/commonjs/fabric/ScreenStackHeaderConfigNativeComponent.js +27 -0
- package/lib/commonjs/fabric/ScreenStackHeaderConfigNativeComponent.js.map +1 -0
- package/lib/commonjs/fabric/ScreenStackHeaderSubview.js +34 -0
- package/lib/commonjs/fabric/ScreenStackHeaderSubview.js.map +1 -0
- package/lib/commonjs/fabric/ScreenStackHeaderSubviewNativeComponent.js +27 -0
- package/lib/commonjs/fabric/ScreenStackHeaderSubviewNativeComponent.js.map +1 -0
- package/lib/commonjs/fabric/ScreenStackNativeComponent.js +21 -0
- package/lib/commonjs/fabric/ScreenStackNativeComponent.js.map +1 -0
- package/lib/commonjs/fabric/index.js +40 -0
- package/lib/commonjs/fabric/index.js.map +1 -0
- package/lib/commonjs/index.native.js +32 -15
- package/lib/commonjs/index.native.js.map +1 -1
- package/lib/module/fabric/Screen.js +11 -0
- package/lib/module/fabric/Screen.js.map +1 -0
- package/lib/module/fabric/ScreenNativeComponent.js +11 -0
- package/lib/module/fabric/ScreenNativeComponent.js.map +1 -0
- package/lib/module/fabric/ScreenStack.js +12 -0
- package/lib/module/fabric/ScreenStack.js.map +1 -0
- package/lib/module/fabric/ScreenStackHeaderConfigNativeComponent.js +10 -0
- package/lib/module/fabric/ScreenStackHeaderConfigNativeComponent.js.map +1 -0
- package/lib/module/fabric/ScreenStackHeaderSubview.js +21 -0
- package/lib/module/fabric/ScreenStackHeaderSubview.js.map +1 -0
- package/lib/module/fabric/ScreenStackHeaderSubviewNativeComponent.js +10 -0
- package/lib/module/fabric/ScreenStackHeaderSubviewNativeComponent.js.map +1 -0
- package/lib/module/fabric/ScreenStackNativeComponent.js +9 -0
- package/lib/module/fabric/ScreenStackNativeComponent.js.map +1 -0
- package/lib/module/fabric/index.js +6 -0
- package/lib/module/fabric/index.js.map +1 -0
- package/lib/module/index.native.js +32 -15
- package/lib/module/index.native.js.map +1 -1
- package/package.json +17 -3
- package/src/fabric/Screen.js +12 -0
- package/src/fabric/ScreenNativeComponent.js +64 -0
- package/src/fabric/ScreenStack.js +8 -0
- package/src/fabric/ScreenStackHeaderConfigNativeComponent.js +54 -0
- package/src/fabric/ScreenStackHeaderSubview.js +20 -0
- package/src/fabric/ScreenStackHeaderSubviewNativeComponent.js +31 -0
- package/src/fabric/ScreenStackNativeComponent.js +19 -0
- package/src/fabric/index.js +11 -0
- 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,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,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
|