react-native-screens 3.11.0 → 3.13.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/java/com/swmansion/rnscreens/ScreenWindowTraits.kt +4 -2
- 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/RNSScreen.h +1 -1
- 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/RNSScreenStack.m +12 -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 -4
- 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,16 @@
|
|
|
1
|
+
package com.swmansion.rnscreens
|
|
2
|
+
|
|
3
|
+
import android.view.ViewGroup
|
|
4
|
+
import com.facebook.react.bridge.ReactContext
|
|
5
|
+
import androidx.annotation.UiThread
|
|
6
|
+
import com.facebook.react.uimanager.PixelUtil
|
|
7
|
+
import com.facebook.react.bridge.ReadableMap
|
|
8
|
+
import com.facebook.react.bridge.WritableMap
|
|
9
|
+
import com.facebook.react.bridge.WritableNativeMap
|
|
10
|
+
import kotlin.math.abs
|
|
11
|
+
|
|
12
|
+
abstract class FabricEnabledViewGroup constructor(context: ReactContext?) : ViewGroup(context) {
|
|
13
|
+
protected fun updateScreenSizeFabric(width: Int, height: Int) {
|
|
14
|
+
// do nothing
|
|
15
|
+
}
|
|
16
|
+
}
|
|
@@ -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
|
package/ios/RNSScreen.h
CHANGED
|
@@ -30,8 +30,8 @@ typedef NS_ENUM(NSInteger, RNSScreenReplaceAnimation) {
|
|
|
30
30
|
};
|
|
31
31
|
|
|
32
32
|
typedef NS_ENUM(NSInteger, RNSScreenSwipeDirection) {
|
|
33
|
-
RNSScreenSwipeDirectionVertical,
|
|
34
33
|
RNSScreenSwipeDirectionHorizontal,
|
|
34
|
+
RNSScreenSwipeDirectionVertical,
|
|
35
35
|
};
|
|
36
36
|
|
|
37
37
|
typedef NS_ENUM(NSInteger, RNSActivityState) {
|
|
@@ -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
|
package/ios/RNSScreenStack.m
CHANGED
|
@@ -142,6 +142,10 @@
|
|
|
142
142
|
// that can handle it when dismissing a modal, the same for orientation
|
|
143
143
|
[RNSScreenWindowTraits updateWindowTraits];
|
|
144
144
|
[_presentedModals removeObject:presentationController.presentedViewController];
|
|
145
|
+
// we double check if there are no new controllers pending to be presented since someone could
|
|
146
|
+
// have tried to push another one during the transition
|
|
147
|
+
_updatingModals = NO;
|
|
148
|
+
[self updateContainer];
|
|
145
149
|
if (self.onFinishTransitioning) {
|
|
146
150
|
// instead of directly triggering onFinishTransitioning this time we enqueue the event on the
|
|
147
151
|
// main queue. We do that because onDismiss event is also enqueued and we want for the transition
|
|
@@ -362,6 +366,14 @@
|
|
|
362
366
|
BOOL shouldAnimate = lastModal && [next isKindOfClass:[RNSScreen class]] &&
|
|
363
367
|
((RNSScreenView *)next.view).stackAnimation != RNSScreenStackAnimationNone;
|
|
364
368
|
|
|
369
|
+
// if you want to present another modal quick enough after dismissing the previous one,
|
|
370
|
+
// it will result in wrong changeRootController, see repro in
|
|
371
|
+
// https://github.com/software-mansion/react-native-screens/issues/1299 We call `updateContainer` again in
|
|
372
|
+
// `presentationControllerDidDismiss` to cover this case and present new controller
|
|
373
|
+
if (previous.beingDismissed) {
|
|
374
|
+
return;
|
|
375
|
+
}
|
|
376
|
+
|
|
365
377
|
[previous presentViewController:next
|
|
366
378
|
animated:shouldAnimate
|
|
367
379
|
completion:^{
|
|
@@ -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
|