react-nitro-renderer 0.0.0-stage → 0.0.1-alpha.7
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/LICENSE +21 -0
- package/Package.swift +104 -0
- package/README.md +111 -2
- package/Sources/ReactNitroRenderer/Animations/AnimationCurve+toUIAnimationCurve.swift +31 -0
- package/Sources/ReactNitroRenderer/Animations/HybridAnimator.swift +36 -0
- package/Sources/ReactNitroRenderer/Animations/View+Animations.swift +39 -0
- package/Sources/ReactNitroRenderer/Components/HybridLabel.swift +89 -0
- package/Sources/ReactNitroRenderer/Components/HybridScrollView.swift +21 -0
- package/Sources/ReactNitroRenderer/Components/HybridScrollViewContent.swift +36 -0
- package/Sources/ReactNitroRenderer/Components/HybridView.swift +22 -0
- package/Sources/ReactNitroRenderer/Components/View.swift +267 -0
- package/Sources/ReactNitroRenderer/CustomViewController.swift +36 -0
- package/Sources/ReactNitroRenderer/Extensions/Corner+toCACornerMask.swift +16 -0
- package/Sources/ReactNitroRenderer/Extensions/CornerCurve+toUICornerCurve.swift +23 -0
- package/Sources/ReactNitroRenderer/Extensions/EdgeInsets+UIEdgeInsets.swift +7 -0
- package/Sources/ReactNitroRenderer/Extensions/ModifierKey+toUIKeyModifierFlags.swift +31 -0
- package/Sources/ReactNitroRenderer/Extensions/Point+CGPoint.swift +15 -0
- package/Sources/ReactNitroRenderer/Extensions/UIGestureRecognizerState+toUIGestureRecognizerState.swift +39 -0
- package/Sources/ReactNitroRenderer/Gestures/HybridGestureRecognizer.swift +40 -0
- package/Sources/ReactNitroRenderer/Gestures/HybridLongPressGestureRecognizer.swift +53 -0
- package/Sources/ReactNitroRenderer/Gestures/HybridPanGestureRecognizer.swift +52 -0
- package/Sources/ReactNitroRenderer/Gestures/HybridTapGestureRecognizer.swift +42 -0
- package/Sources/ReactNitroRenderer/HybridApplication.swift +19 -0
- package/Sources/ReactNitroRenderer/HybridScreen.swift +22 -0
- package/Sources/ReactNitroRenderer/HybridViewController.swift +66 -0
- package/Sources/ReactNitroRenderer/HybridWindow.swift +25 -0
- package/Sources/ReactNitroRenderer/HybridWindowScene.swift +16 -0
- package/Sources/ReactNitroRenderer/RegisterRootCallback.swift +28 -0
- package/Sources/ReactNitroRenderer/RuntimeReloadableAppDelegate.swift +14 -0
- package/Sources/ReactNitroRenderer/SafeAreaInsetsListeners.swift +22 -0
- package/Sources/ReactNitroRenderer/UIColor+initRGBA.swift +10 -0
- package/Sources/ReactNitroRenderer/UIColor+rgba.swift +20 -0
- package/Sources/ReactNitroRenderer/ViewController.swift +13 -0
- package/Sources/ReactNitroRenderer/Window.swift +12 -0
- package/Sources/ReactNitroRenderer/WindowScene.swift +12 -0
- package/Sources/ReactNitroRenderer/YGNode.swift +46 -0
- package/nitrogen/generated/.gitattributes +1 -0
- package/nitrogen/generated/apple/ReactNitroRenderer-Swift-Cxx-Bridge.cpp +376 -0
- package/nitrogen/generated/apple/ReactNitroRendererAppleCxx/ReactNitroRendererAppleCxx.cpp +9 -0
- package/nitrogen/generated/apple/ReactNitroRendererAppleCxx/include/ReactNitroRendererAppleCxx/ReactNitroRendererAppleCxx.h +245 -0
- package/nitrogen/generated/apple/ReactNitroRendererAutolinking.cpp +46 -0
- package/nitrogen/generated/apple/ReactNitroRendererAutolinking.mm +24 -0
- package/nitrogen/generated/apple/c++/AnimationCurve-Swift.cpp +42 -0
- package/nitrogen/generated/apple/c++/Corner-Swift.cpp +52 -0
- package/nitrogen/generated/apple/c++/CornerCurve-Swift.cpp +46 -0
- package/nitrogen/generated/apple/c++/EdgeInsets-Swift.cpp +35 -0
- package/nitrogen/generated/apple/c++/Frame-Swift.cpp +35 -0
- package/nitrogen/generated/apple/c++/GestureRecognizerState-Swift.cpp +44 -0
- package/nitrogen/generated/apple/c++/HybridAnimatorSpecSwift.cpp +53 -0
- package/nitrogen/generated/apple/c++/HybridAnimatorSpec_cxx-Swift.cpp +28 -0
- package/nitrogen/generated/apple/c++/HybridApplicationSpecSwift.cpp +58 -0
- package/nitrogen/generated/apple/c++/HybridApplicationSpec_cxx-Swift.cpp +28 -0
- package/nitrogen/generated/apple/c++/HybridGestureRecognizerSpecSwift.cpp +48 -0
- package/nitrogen/generated/apple/c++/HybridGestureRecognizerSpec_cxx-Swift.cpp +28 -0
- package/nitrogen/generated/apple/c++/HybridLabelSpecSwift.cpp +49 -0
- package/nitrogen/generated/apple/c++/HybridLabelSpec_cxx-Swift.cpp +28 -0
- package/nitrogen/generated/apple/c++/HybridLongPressGestureRecognizerSpecSwift.cpp +85 -0
- package/nitrogen/generated/apple/c++/HybridLongPressGestureRecognizerSpec_cxx-Swift.cpp +28 -0
- package/nitrogen/generated/apple/c++/HybridPanGestureRecognizerSpecSwift.cpp +89 -0
- package/nitrogen/generated/apple/c++/HybridPanGestureRecognizerSpec_cxx-Swift.cpp +28 -0
- package/nitrogen/generated/apple/c++/HybridScreenSpecSwift.cpp +44 -0
- package/nitrogen/generated/apple/c++/HybridScreenSpec_cxx-Swift.cpp +28 -0
- package/nitrogen/generated/apple/c++/HybridScrollViewContentSpecSwift.cpp +40 -0
- package/nitrogen/generated/apple/c++/HybridScrollViewContentSpec_cxx-Swift.cpp +28 -0
- package/nitrogen/generated/apple/c++/HybridScrollViewSpecSwift.cpp +40 -0
- package/nitrogen/generated/apple/c++/HybridScrollViewSpec_cxx-Swift.cpp +28 -0
- package/nitrogen/generated/apple/c++/HybridTapGestureRecognizerSpecSwift.cpp +67 -0
- package/nitrogen/generated/apple/c++/HybridTapGestureRecognizerSpec_cxx-Swift.cpp +28 -0
- package/nitrogen/generated/apple/c++/HybridViewControllerSpecSwift.cpp +91 -0
- package/nitrogen/generated/apple/c++/HybridViewControllerSpec_cxx-Swift.cpp +28 -0
- package/nitrogen/generated/apple/c++/HybridViewSpecSwift.cpp +231 -0
- package/nitrogen/generated/apple/c++/HybridViewSpec_cxx-Swift.cpp +28 -0
- package/nitrogen/generated/apple/c++/HybridWindowSceneSpecSwift.cpp +34 -0
- package/nitrogen/generated/apple/c++/HybridWindowSceneSpec_cxx-Swift.cpp +28 -0
- package/nitrogen/generated/apple/c++/HybridWindowSpecSwift.cpp +53 -0
- package/nitrogen/generated/apple/c++/HybridWindowSpec_cxx-Swift.cpp +28 -0
- package/nitrogen/generated/apple/c++/ListenerSubscription-Swift.cpp +37 -0
- package/nitrogen/generated/apple/c++/ModifierKey-Swift.cpp +52 -0
- package/nitrogen/generated/apple/c++/Point-Swift.cpp +33 -0
- package/nitrogen/generated/apple/c++/Point3D-Swift.cpp +34 -0
- package/nitrogen/generated/apple/c++/Size-Swift.cpp +33 -0
- package/nitrogen/generated/apple/c++/include/ReactNitroRenderer/ReactNitroRendererAutolinking.hpp +13 -0
- package/nitrogen/generated/apple/c++/include/ReactNitroRenderer/private/AnimationCurve-Swift.hpp +23 -0
- package/nitrogen/generated/apple/c++/include/ReactNitroRenderer/private/Corner-Swift.hpp +23 -0
- package/nitrogen/generated/apple/c++/include/ReactNitroRenderer/private/CornerCurve-Swift.hpp +23 -0
- package/nitrogen/generated/apple/c++/include/ReactNitroRenderer/private/EdgeInsets-Swift.hpp +23 -0
- package/nitrogen/generated/apple/c++/include/ReactNitroRenderer/private/Frame-Swift.hpp +23 -0
- package/nitrogen/generated/apple/c++/include/ReactNitroRenderer/private/GestureRecognizerState-Swift.hpp +23 -0
- package/nitrogen/generated/apple/c++/include/ReactNitroRenderer/private/HybridAnimatorSpecSwift.hpp +73 -0
- package/nitrogen/generated/apple/c++/include/ReactNitroRenderer/private/HybridAnimatorSpec_cxx-Swift.hpp +23 -0
- package/nitrogen/generated/apple/c++/include/ReactNitroRenderer/private/HybridApplicationSpecSwift.hpp +74 -0
- package/nitrogen/generated/apple/c++/include/ReactNitroRenderer/private/HybridApplicationSpec_cxx-Swift.hpp +23 -0
- package/nitrogen/generated/apple/c++/include/ReactNitroRenderer/private/HybridGestureRecognizerSpecSwift.hpp +74 -0
- package/nitrogen/generated/apple/c++/include/ReactNitroRenderer/private/HybridGestureRecognizerSpec_cxx-Swift.hpp +23 -0
- package/nitrogen/generated/apple/c++/include/ReactNitroRenderer/private/HybridLabelSpecSwift.hpp +74 -0
- package/nitrogen/generated/apple/c++/include/ReactNitroRenderer/private/HybridLabelSpec_cxx-Swift.hpp +23 -0
- package/nitrogen/generated/apple/c++/include/ReactNitroRenderer/private/HybridLongPressGestureRecognizerSpecSwift.hpp +82 -0
- package/nitrogen/generated/apple/c++/include/ReactNitroRenderer/private/HybridLongPressGestureRecognizerSpec_cxx-Swift.hpp +23 -0
- package/nitrogen/generated/apple/c++/include/ReactNitroRenderer/private/HybridPanGestureRecognizerSpecSwift.hpp +80 -0
- package/nitrogen/generated/apple/c++/include/ReactNitroRenderer/private/HybridPanGestureRecognizerSpec_cxx-Swift.hpp +23 -0
- package/nitrogen/generated/apple/c++/include/ReactNitroRenderer/private/HybridScreenSpecSwift.hpp +73 -0
- package/nitrogen/generated/apple/c++/include/ReactNitroRenderer/private/HybridScreenSpec_cxx-Swift.hpp +23 -0
- package/nitrogen/generated/apple/c++/include/ReactNitroRenderer/private/HybridScrollViewContentSpecSwift.hpp +72 -0
- package/nitrogen/generated/apple/c++/include/ReactNitroRenderer/private/HybridScrollViewContentSpec_cxx-Swift.hpp +23 -0
- package/nitrogen/generated/apple/c++/include/ReactNitroRenderer/private/HybridScrollViewSpecSwift.hpp +72 -0
- package/nitrogen/generated/apple/c++/include/ReactNitroRenderer/private/HybridScrollViewSpec_cxx-Swift.hpp +23 -0
- package/nitrogen/generated/apple/c++/include/ReactNitroRenderer/private/HybridTapGestureRecognizerSpecSwift.hpp +78 -0
- package/nitrogen/generated/apple/c++/include/ReactNitroRenderer/private/HybridTapGestureRecognizerSpec_cxx-Swift.hpp +23 -0
- package/nitrogen/generated/apple/c++/include/ReactNitroRenderer/private/HybridViewControllerSpecSwift.hpp +77 -0
- package/nitrogen/generated/apple/c++/include/ReactNitroRenderer/private/HybridViewControllerSpec_cxx-Swift.hpp +23 -0
- package/nitrogen/generated/apple/c++/include/ReactNitroRenderer/private/HybridViewSpecSwift.hpp +102 -0
- package/nitrogen/generated/apple/c++/include/ReactNitroRenderer/private/HybridViewSpec_cxx-Swift.hpp +23 -0
- package/nitrogen/generated/apple/c++/include/ReactNitroRenderer/private/HybridWindowSceneSpecSwift.hpp +71 -0
- package/nitrogen/generated/apple/c++/include/ReactNitroRenderer/private/HybridWindowSceneSpec_cxx-Swift.hpp +23 -0
- package/nitrogen/generated/apple/c++/include/ReactNitroRenderer/private/HybridWindowSpecSwift.hpp +74 -0
- package/nitrogen/generated/apple/c++/include/ReactNitroRenderer/private/HybridWindowSpec_cxx-Swift.hpp +23 -0
- package/nitrogen/generated/apple/c++/include/ReactNitroRenderer/private/ListenerSubscription-Swift.hpp +23 -0
- package/nitrogen/generated/apple/c++/include/ReactNitroRenderer/private/ModifierKey-Swift.hpp +23 -0
- package/nitrogen/generated/apple/c++/include/ReactNitroRenderer/private/Point-Swift.hpp +23 -0
- package/nitrogen/generated/apple/c++/include/ReactNitroRenderer/private/Point3D-Swift.hpp +23 -0
- package/nitrogen/generated/apple/c++/include/ReactNitroRenderer/private/ReactNitroRenderer-Swift-Cxx-Umbrella.hpp +69 -0
- package/nitrogen/generated/apple/c++/include/ReactNitroRenderer/private/Size-Swift.hpp +23 -0
- package/nitrogen/generated/apple/c++/include/module.modulemap +12 -0
- package/nitrogen/generated/apple/swift/AnimationCurve.swift +64 -0
- package/nitrogen/generated/apple/swift/Callback___ReactNitroRenderer__HybridWindowSpec_cxx___ReactNitroRenderer__HybridWindowSceneSpec_cxx.swift +71 -0
- package/nitrogen/generated/apple/swift/Callback_void.swift +60 -0
- package/nitrogen/generated/apple/swift/Callback_void___ReactNitroRenderer__EdgeInsets.swift +66 -0
- package/nitrogen/generated/apple/swift/Callback_void___ReactNitroRenderer__HybridLongPressGestureRecognizerSpec_cxx.swift +66 -0
- package/nitrogen/generated/apple/swift/Callback_void___ReactNitroRenderer__HybridPanGestureRecognizerSpec_cxx.swift +66 -0
- package/nitrogen/generated/apple/swift/Callback_void___ReactNitroRenderer__HybridTapGestureRecognizerSpec_cxx.swift +66 -0
- package/nitrogen/generated/apple/swift/Corner.swift +64 -0
- package/nitrogen/generated/apple/swift/CornerCurve.swift +54 -0
- package/nitrogen/generated/apple/swift/EdgeInsets.swift +49 -0
- package/nitrogen/generated/apple/swift/Frame.swift +49 -0
- package/nitrogen/generated/apple/swift/GestureRecognizerState.swift +74 -0
- package/nitrogen/generated/apple/swift/HybridAnimatorSpec.swift +67 -0
- package/nitrogen/generated/apple/swift/HybridAnimatorSpec_cxx.swift +158 -0
- package/nitrogen/generated/apple/swift/HybridApplicationSpec.swift +67 -0
- package/nitrogen/generated/apple/swift/HybridApplicationSpec_cxx.swift +160 -0
- package/nitrogen/generated/apple/swift/HybridGestureRecognizerSpec.swift +67 -0
- package/nitrogen/generated/apple/swift/HybridGestureRecognizerSpec_cxx.swift +147 -0
- package/nitrogen/generated/apple/swift/HybridLabelSpec.swift +66 -0
- package/nitrogen/generated/apple/swift/HybridLabelSpec_cxx.swift +157 -0
- package/nitrogen/generated/apple/swift/HybridLongPressGestureRecognizerSpec.swift +70 -0
- package/nitrogen/generated/apple/swift/HybridLongPressGestureRecognizerSpec_cxx.swift +193 -0
- package/nitrogen/generated/apple/swift/HybridPanGestureRecognizerSpec.swift +69 -0
- package/nitrogen/generated/apple/swift/HybridPanGestureRecognizerSpec_cxx.swift +195 -0
- package/nitrogen/generated/apple/swift/HybridScreenSpec.swift +67 -0
- package/nitrogen/generated/apple/swift/HybridScreenSpec_cxx.swift +146 -0
- package/nitrogen/generated/apple/swift/HybridScrollViewContentSpec.swift +66 -0
- package/nitrogen/generated/apple/swift/HybridScrollViewContentSpec_cxx.swift +148 -0
- package/nitrogen/generated/apple/swift/HybridScrollViewSpec.swift +66 -0
- package/nitrogen/generated/apple/swift/HybridScrollViewSpec_cxx.swift +148 -0
- package/nitrogen/generated/apple/swift/HybridTapGestureRecognizerSpec.swift +68 -0
- package/nitrogen/generated/apple/swift/HybridTapGestureRecognizerSpec_cxx.swift +175 -0
- package/nitrogen/generated/apple/swift/HybridViewControllerSpec.swift +68 -0
- package/nitrogen/generated/apple/swift/HybridViewControllerSpec_cxx.swift +185 -0
- package/nitrogen/generated/apple/swift/HybridViewSpec.swift +89 -0
- package/nitrogen/generated/apple/swift/HybridViewSpec_cxx.swift +335 -0
- package/nitrogen/generated/apple/swift/HybridWindowSceneSpec.swift +65 -0
- package/nitrogen/generated/apple/swift/HybridWindowSceneSpec_cxx.swift +136 -0
- package/nitrogen/generated/apple/swift/HybridWindowSpec.swift +65 -0
- package/nitrogen/generated/apple/swift/HybridWindowSpec_cxx.swift +156 -0
- package/nitrogen/generated/apple/swift/ListenerSubscription.swift +29 -0
- package/nitrogen/generated/apple/swift/ModifierKey.swift +64 -0
- package/nitrogen/generated/apple/swift/Point.swift +35 -0
- package/nitrogen/generated/apple/swift/Point3D.swift +42 -0
- package/nitrogen/generated/apple/swift/Promise___ReactNitroRenderer__HybridWindowSpec_cxx.swift +102 -0
- package/nitrogen/generated/apple/swift/Promise_void.swift +100 -0
- package/nitrogen/generated/apple/swift/ReactNitroRenderer+ForeignTypeMetadata.swift +34 -0
- package/nitrogen/generated/apple/swift/Size.swift +35 -0
- package/nitrogen/generated/hybrid-classes.json +144 -0
- package/nitrogen/generated/shared/c++/ReactNitroRendererCxxModule.cpp +2 -0
- package/nitrogen/generated/shared/c++/include/ReactNitroRenderer/ReactNitroRendererCxxModule.hpp +2 -0
- package/nitrogen/generated/shared/javascript/Animator.cjs +19 -0
- package/nitrogen/generated/shared/javascript/Animator.d.cts +9 -0
- package/nitrogen/generated/shared/javascript/Application.cjs +19 -0
- package/nitrogen/generated/shared/javascript/Application.d.cts +9 -0
- package/nitrogen/generated/shared/javascript/GestureRecognizer.cjs +19 -0
- package/nitrogen/generated/shared/javascript/GestureRecognizer.d.cts +9 -0
- package/nitrogen/generated/shared/javascript/Label.cjs +19 -0
- package/nitrogen/generated/shared/javascript/Label.d.cts +9 -0
- package/nitrogen/generated/shared/javascript/LongPressGestureRecognizer.cjs +19 -0
- package/nitrogen/generated/shared/javascript/LongPressGestureRecognizer.d.cts +9 -0
- package/nitrogen/generated/shared/javascript/PanGestureRecognizer.cjs +19 -0
- package/nitrogen/generated/shared/javascript/PanGestureRecognizer.d.cts +9 -0
- package/nitrogen/generated/shared/javascript/Screen.cjs +19 -0
- package/nitrogen/generated/shared/javascript/Screen.d.cts +9 -0
- package/nitrogen/generated/shared/javascript/ScrollView.cjs +19 -0
- package/nitrogen/generated/shared/javascript/ScrollView.d.cts +9 -0
- package/nitrogen/generated/shared/javascript/ScrollViewContent.cjs +19 -0
- package/nitrogen/generated/shared/javascript/ScrollViewContent.d.cts +9 -0
- package/nitrogen/generated/shared/javascript/TapGestureRecognizer.cjs +19 -0
- package/nitrogen/generated/shared/javascript/TapGestureRecognizer.d.cts +9 -0
- package/nitrogen/generated/shared/javascript/View.cjs +19 -0
- package/nitrogen/generated/shared/javascript/View.d.cts +9 -0
- package/nitrogen/generated/shared/javascript/ViewController.cjs +19 -0
- package/nitrogen/generated/shared/javascript/ViewController.d.cts +9 -0
- package/nitrogen/generated/shared/javascript/Window.cjs +19 -0
- package/nitrogen/generated/shared/javascript/Window.d.cts +9 -0
- package/nitrogen/generated/shared/javascript/WindowScene.cjs +19 -0
- package/nitrogen/generated/shared/javascript/WindowScene.d.cts +9 -0
- package/package.json +42 -4
- package/src/NitroRendererHostConfig.ts +396 -0
- package/src/PropSetter.ts +29 -0
- package/src/StylePropSetters.ts +145 -0
- package/src/ViewPropSetters.ts +33 -0
- package/src/ViewRegistry.ts +47 -0
- package/src/YogaPropSetters.ts +347 -0
- package/src/components/ScrollView.tsx +30 -0
- package/src/components/ScrollViewContent.tsx +12 -0
- package/src/components/Text.tsx +34 -0
- package/src/components/View.ts +33 -0
- package/src/contexts/RootContext.ts +5 -0
- package/src/getViewYogaNode.ts +9 -0
- package/src/hooks/useRootContext.ts +11 -0
- package/src/hooks/useSafeAreaInsets.ts +36 -0
- package/src/hybrids.ts +9 -0
- package/src/index.ts +30 -0
- package/src/registerApp.ts +22 -0
- package/src/renderRoot.ts +44 -0
- package/src/specs/Animations/AnimationCurve.ts +6 -0
- package/src/specs/Animations/Animator.nitro.ts +16 -0
- package/src/specs/Application.nitro.ts +20 -0
- package/src/specs/Corner.ts +1 -0
- package/src/specs/EdgeInsets.ts +13 -0
- package/src/specs/Frame.ts +6 -0
- package/src/specs/Gestures/GestureRecognizer.nitro.ts +26 -0
- package/src/specs/Gestures/LongPressGestureRecognizer.nitro.ts +26 -0
- package/src/specs/Gestures/PanGestureRecognizer.nitro.ts +33 -0
- package/src/specs/Gestures/TapGestureRecognizer.nitro.ts +20 -0
- package/src/specs/Label.nitro.ts +16 -0
- package/src/specs/ListenerSubscription.ts +3 -0
- package/src/specs/Screen.nitro.ts +16 -0
- package/src/specs/ScrollView.nitro.ts +14 -0
- package/src/specs/ScrollViewContent.nitro.ts +14 -0
- package/src/specs/Size.ts +4 -0
- package/src/specs/View.nitro.ts +112 -0
- package/src/specs/ViewController.nitro.ts +29 -0
- package/src/specs/Window.nitro.ts +20 -0
- package/src/specs/WindowScene.nitro.ts +15 -0
- package/src/types/ReactNitroReconcilerHostConfig.ts +44 -0
- package/src/types/ReactRoot.ts +5 -0
- package/src/types/StrictMap.ts +6 -0
- package/src/types/ViewPropsUpdater.ts +30 -0
- package/src/types/YogaStyleProps.ts +47 -0
- package/src/utils/arePropArraysEqual.ts +18 -0
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
///
|
|
2
|
+
/// ViewController.cjs
|
|
3
|
+
/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
|
|
4
|
+
/// https://github.com/margelo/nitro
|
|
5
|
+
/// Copyright © Marc Rousavy @ Margelo
|
|
6
|
+
///
|
|
7
|
+
|
|
8
|
+
const { NitroModules } = require('nitro-core')
|
|
9
|
+
|
|
10
|
+
let hybridClass
|
|
11
|
+
|
|
12
|
+
module.exports = {
|
|
13
|
+
get ViewController() {
|
|
14
|
+
if (hybridClass === undefined) {
|
|
15
|
+
hybridClass = NitroModules.getHybridClass('renderer.ViewController')
|
|
16
|
+
}
|
|
17
|
+
return hybridClass
|
|
18
|
+
},
|
|
19
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
///
|
|
2
|
+
/// ViewController.d.cts
|
|
3
|
+
/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
|
|
4
|
+
/// https://github.com/margelo/nitro
|
|
5
|
+
/// Copyright © Marc Rousavy @ Margelo
|
|
6
|
+
///
|
|
7
|
+
|
|
8
|
+
// The spec's `export declare class ViewController` types this runtime export.
|
|
9
|
+
export {}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
///
|
|
2
|
+
/// Window.cjs
|
|
3
|
+
/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
|
|
4
|
+
/// https://github.com/margelo/nitro
|
|
5
|
+
/// Copyright © Marc Rousavy @ Margelo
|
|
6
|
+
///
|
|
7
|
+
|
|
8
|
+
const { NitroModules } = require('nitro-core')
|
|
9
|
+
|
|
10
|
+
let hybridClass
|
|
11
|
+
|
|
12
|
+
module.exports = {
|
|
13
|
+
get Window() {
|
|
14
|
+
if (hybridClass === undefined) {
|
|
15
|
+
hybridClass = NitroModules.getHybridClass('renderer.Window')
|
|
16
|
+
}
|
|
17
|
+
return hybridClass
|
|
18
|
+
},
|
|
19
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
///
|
|
2
|
+
/// WindowScene.cjs
|
|
3
|
+
/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
|
|
4
|
+
/// https://github.com/margelo/nitro
|
|
5
|
+
/// Copyright © Marc Rousavy @ Margelo
|
|
6
|
+
///
|
|
7
|
+
|
|
8
|
+
const { NitroModules } = require('nitro-core')
|
|
9
|
+
|
|
10
|
+
let hybridClass
|
|
11
|
+
|
|
12
|
+
module.exports = {
|
|
13
|
+
get WindowScene() {
|
|
14
|
+
if (hybridClass === undefined) {
|
|
15
|
+
hybridClass = NitroModules.getHybridClass('renderer.WindowScene')
|
|
16
|
+
}
|
|
17
|
+
return hybridClass
|
|
18
|
+
},
|
|
19
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
///
|
|
2
|
+
/// WindowScene.d.cts
|
|
3
|
+
/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
|
|
4
|
+
/// https://github.com/margelo/nitro
|
|
5
|
+
/// Copyright © Marc Rousavy @ Margelo
|
|
6
|
+
///
|
|
7
|
+
|
|
8
|
+
// The spec's `export declare class WindowScene` types this runtime export.
|
|
9
|
+
export {}
|
package/package.json
CHANGED
|
@@ -1,6 +1,44 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "react-nitro-renderer",
|
|
3
|
-
"version": "0.0.
|
|
4
|
-
"
|
|
5
|
-
|
|
6
|
-
|
|
3
|
+
"version": "0.0.1-alpha.7",
|
|
4
|
+
"dependencies": {
|
|
5
|
+
"nitro-core": "1.0.0-alpha.nightly.105.g69d365fc9b18",
|
|
6
|
+
"react": "19.3.0",
|
|
7
|
+
"react-nitro-yoga": "0.0.1-alpha.7",
|
|
8
|
+
"react-nitro-runtime": "0.0.1-alpha.7",
|
|
9
|
+
"react-reconciler": "0.34.0",
|
|
10
|
+
"@types/react-reconciler": "0.33.0"
|
|
11
|
+
},
|
|
12
|
+
"publishConfig": {
|
|
13
|
+
"tag": "latest",
|
|
14
|
+
"access": "public"
|
|
15
|
+
},
|
|
16
|
+
"module": "src/index.ts",
|
|
17
|
+
"type": "module",
|
|
18
|
+
"exports": {
|
|
19
|
+
".": {
|
|
20
|
+
"types": "./src/index.ts",
|
|
21
|
+
"default": "./src/index.ts"
|
|
22
|
+
},
|
|
23
|
+
"./hybrids": {
|
|
24
|
+
"types": "./src/hybrids.ts",
|
|
25
|
+
"default": "./src/hybrids.ts"
|
|
26
|
+
},
|
|
27
|
+
"./package.json": "./package.json"
|
|
28
|
+
},
|
|
29
|
+
"imports": {
|
|
30
|
+
"#nitro/*": "./nitrogen/generated/shared/javascript/*.cjs"
|
|
31
|
+
},
|
|
32
|
+
"license": "MIT",
|
|
33
|
+
"repository": {
|
|
34
|
+
"type": "git",
|
|
35
|
+
"url": "git+https://github.com/margelo/react-nitro.git",
|
|
36
|
+
"directory": "packages/react-nitro-renderer"
|
|
37
|
+
},
|
|
38
|
+
"files": [
|
|
39
|
+
"src",
|
|
40
|
+
"Package.swift",
|
|
41
|
+
"Sources",
|
|
42
|
+
"nitrogen/generated"
|
|
43
|
+
]
|
|
44
|
+
}
|
|
@@ -0,0 +1,396 @@
|
|
|
1
|
+
import createReconciler from "react-reconciler";
|
|
2
|
+
import type {
|
|
3
|
+
YGNodeRef,
|
|
4
|
+
} from "react-nitro-yoga";
|
|
5
|
+
|
|
6
|
+
import type {
|
|
7
|
+
ReactNitroReconcilerHostConfig,
|
|
8
|
+
ReconcilerElementType,
|
|
9
|
+
ReconcilerProps,
|
|
10
|
+
} from "./types/ReactNitroReconcilerHostConfig";
|
|
11
|
+
import { DefaultEventPriority } from "react-reconciler/constants";
|
|
12
|
+
import type { View } from "./specs/View.nitro";
|
|
13
|
+
import { viewRegistry } from "./ViewRegistry";
|
|
14
|
+
import { getViewYogaNode } from "./getViewYogaNode";
|
|
15
|
+
import { arePropArraysEqual } from "./utils/arePropArraysEqual";
|
|
16
|
+
|
|
17
|
+
// React's host callbacks don't preserve the relationship between type, props,
|
|
18
|
+
// and instance. Erase it only here; React pairs each instance with its host type.
|
|
19
|
+
const reconcilerViewRegistry = viewRegistry as {
|
|
20
|
+
factories: Partial<
|
|
21
|
+
Record<ReconcilerElementType, (props: ReconcilerProps) => View>
|
|
22
|
+
>;
|
|
23
|
+
propSetters: Partial<
|
|
24
|
+
Record<
|
|
25
|
+
ReconcilerElementType,
|
|
26
|
+
Record<string, (view: View, propValue: unknown, previousPropValue?: unknown) => void>
|
|
27
|
+
>
|
|
28
|
+
>;
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
export function createNitroRenderer(rootView: View) {
|
|
32
|
+
let currentUpdatePriority = DefaultEventPriority;
|
|
33
|
+
|
|
34
|
+
const yogaNodeToViewMap = new Map<YGNodeRef, View>();
|
|
35
|
+
const yogaRootNode = getViewYogaNode(rootView);
|
|
36
|
+
yogaNodeToViewMap.set(yogaRootNode, rootView);
|
|
37
|
+
// TODO: i guess the root node can change its dimensions (e.g. iPhone Duo / landscape orientation)
|
|
38
|
+
const rootFrame = rootView.getFrame();
|
|
39
|
+
yoga.YGNodeStyleSetWidth(yogaRootNode, rootFrame.width);
|
|
40
|
+
yoga.YGNodeStyleSetHeight(yogaRootNode, rootFrame.height);
|
|
41
|
+
|
|
42
|
+
const HostConfig: ReactNitroReconcilerHostConfig = {
|
|
43
|
+
// As react is running on the UI thread, we can use mutation mode directly!
|
|
44
|
+
supportsMutation: true,
|
|
45
|
+
// If mutation is true, this has to be false
|
|
46
|
+
supportsPersistence: false,
|
|
47
|
+
// For now we just try to roll with react's own queueMicrotask implementation instead of building our own scheduler
|
|
48
|
+
supportsMicrotasks: true,
|
|
49
|
+
// This is a standalone renderer, not build on top of any other react renderer:
|
|
50
|
+
isPrimaryRenderer: true,
|
|
51
|
+
// TODO: false for now, but check if we can use this as a performance optimization, e.g. for first frame rendering after an app restart
|
|
52
|
+
supportsHydration: false,
|
|
53
|
+
|
|
54
|
+
// TODO: is there an optimization chance in passing props directly in the view constructor? this could avoid optional prop's boxing
|
|
55
|
+
createInstance(type, props) {
|
|
56
|
+
const viewFactory = reconcilerViewRegistry.factories[type];
|
|
57
|
+
if (viewFactory == null) {
|
|
58
|
+
throw new Error(`No view registered for type: ${type}`);
|
|
59
|
+
}
|
|
60
|
+
const viewInstance = viewFactory(props);
|
|
61
|
+
const yogaNode = getViewYogaNode(viewInstance);
|
|
62
|
+
yogaNodeToViewMap.set(yogaNode, viewInstance);
|
|
63
|
+
|
|
64
|
+
updatePropsOnView(viewInstance, type, props);
|
|
65
|
+
return viewInstance;
|
|
66
|
+
},
|
|
67
|
+
|
|
68
|
+
createTextInstance() {
|
|
69
|
+
throw new Error(
|
|
70
|
+
`This should never be reached as we use the performance optimized shouldSetTextContent. Have you passed string as a children to a non-text component?`,
|
|
71
|
+
);
|
|
72
|
+
},
|
|
73
|
+
|
|
74
|
+
shouldSetTextContent(type) {
|
|
75
|
+
if (type === "Text") {
|
|
76
|
+
return true;
|
|
77
|
+
}
|
|
78
|
+
return false;
|
|
79
|
+
},
|
|
80
|
+
resetTextContent(_instance) {
|
|
81
|
+
throw new Error(
|
|
82
|
+
"This should never be reached, as text components stay as text in ReactNitro.",
|
|
83
|
+
);
|
|
84
|
+
},
|
|
85
|
+
commitTextUpdate(textInstance, _oldText, newText) {
|
|
86
|
+
textInstance.text = newText;
|
|
87
|
+
},
|
|
88
|
+
|
|
89
|
+
appendInitialChild: appendChild,
|
|
90
|
+
|
|
91
|
+
appendChild,
|
|
92
|
+
|
|
93
|
+
appendChildToContainer(container, child) {
|
|
94
|
+
appendChild(container.rootView, child);
|
|
95
|
+
},
|
|
96
|
+
|
|
97
|
+
insertBefore,
|
|
98
|
+
|
|
99
|
+
insertInContainerBefore(container, child, beforeChild) {
|
|
100
|
+
insertBefore(container.rootView, child, beforeChild);
|
|
101
|
+
},
|
|
102
|
+
|
|
103
|
+
removeChild(parentInstance, child) {
|
|
104
|
+
parentInstance.removeChild(child);
|
|
105
|
+
const parentYogaNode = getViewYogaNode(parentInstance);
|
|
106
|
+
const childYogaNode = getViewYogaNode(child);
|
|
107
|
+
globalThis.yoga.YGNodeRemoveChild(parentYogaNode, childYogaNode);
|
|
108
|
+
},
|
|
109
|
+
|
|
110
|
+
removeChildFromContainer(container, child) {
|
|
111
|
+
container.rootView.removeChild(child);
|
|
112
|
+
const parentYogaNode = getViewYogaNode(container.rootView);
|
|
113
|
+
const childYogaNode = getViewYogaNode(child);
|
|
114
|
+
globalThis.yoga.YGNodeRemoveChild(parentYogaNode, childYogaNode);
|
|
115
|
+
},
|
|
116
|
+
|
|
117
|
+
detachDeletedInstance(instance) {
|
|
118
|
+
const yogaNode = getViewYogaNode(instance);
|
|
119
|
+
yogaNodeToViewMap.delete(yogaNode);
|
|
120
|
+
// TODO: eagerly "gc", figure out if this is a good idea performance wise
|
|
121
|
+
// TODO: disabled for now, measure memory impact of this!
|
|
122
|
+
// instance.dispose();
|
|
123
|
+
},
|
|
124
|
+
|
|
125
|
+
clearContainer(container) {
|
|
126
|
+
const rootYogaNode = getViewYogaNode(container.rootView);
|
|
127
|
+
const childCount = globalThis.yoga.YGNodeGetChildCount(rootYogaNode);
|
|
128
|
+
for (let index = childCount - 1; index >= 0; index--) {
|
|
129
|
+
const childYogaNode = globalThis.yoga.YGNodeGetChild(rootYogaNode, index);
|
|
130
|
+
const child = yogaNodeToViewMap.get(childYogaNode);
|
|
131
|
+
if (child == null) {
|
|
132
|
+
throw new Error("View not found for yoga node");
|
|
133
|
+
}
|
|
134
|
+
container.rootView.removeChild(child);
|
|
135
|
+
globalThis.yoga.YGNodeRemoveChild(rootYogaNode, childYogaNode);
|
|
136
|
+
}
|
|
137
|
+
},
|
|
138
|
+
|
|
139
|
+
finalizeInitialChildren() {
|
|
140
|
+
// Called when the render phase is finishing (next is committing it).
|
|
141
|
+
// Returning false for now as at this point i don't see that there is any additional work we'd like to do.
|
|
142
|
+
return false;
|
|
143
|
+
},
|
|
144
|
+
|
|
145
|
+
getRootHostContext() {
|
|
146
|
+
return null; // not sure if we are going to use that anywhere
|
|
147
|
+
},
|
|
148
|
+
getChildHostContext(parentHostContext) {
|
|
149
|
+
return parentHostContext; // returning parent means opting out
|
|
150
|
+
},
|
|
151
|
+
|
|
152
|
+
getPublicInstance(instance) {
|
|
153
|
+
return instance;
|
|
154
|
+
},
|
|
155
|
+
|
|
156
|
+
prepareForCommit() {
|
|
157
|
+
return null;
|
|
158
|
+
},
|
|
159
|
+
resetAfterCommit(container) {
|
|
160
|
+
// called right after React has performed the tree mutations, but before layout effects
|
|
161
|
+
|
|
162
|
+
// Calculate the layout
|
|
163
|
+
const start = performance.now();
|
|
164
|
+
const rootView = container.rootView;
|
|
165
|
+
const rootViewNode = getViewYogaNode(rootView);
|
|
166
|
+
const { width, height } = rootView.getFrame();
|
|
167
|
+
globalThis.yoga.YGNodeCalculateLayout(
|
|
168
|
+
rootViewNode,
|
|
169
|
+
width,
|
|
170
|
+
height,
|
|
171
|
+
yoga.YGDirectionLTR,
|
|
172
|
+
);
|
|
173
|
+
// Iterate over all dirty nodes and update the corresponding views with the calculated layout.
|
|
174
|
+
const end = performance.now();
|
|
175
|
+
console.log(`Layout calculation took ${end - start} ms`);
|
|
176
|
+
applyLayout(rootViewNode);
|
|
177
|
+
console.log(`Layout application took ${performance.now() - end} ms`);
|
|
178
|
+
},
|
|
179
|
+
commitUpdate(instance, type, prevProps, nextProps) {
|
|
180
|
+
updatePropsOnView(instance, type, nextProps, prevProps);
|
|
181
|
+
},
|
|
182
|
+
|
|
183
|
+
preparePortalMount() {
|
|
184
|
+
// not used in ReactNitro yet
|
|
185
|
+
},
|
|
186
|
+
|
|
187
|
+
scheduleTimeout(fn, delay) {
|
|
188
|
+
return setTimeout(fn, delay ?? 0);
|
|
189
|
+
},
|
|
190
|
+
cancelTimeout(id) {
|
|
191
|
+
clearTimeout(id);
|
|
192
|
+
},
|
|
193
|
+
noTimeout: -1,
|
|
194
|
+
|
|
195
|
+
//#region scheduling
|
|
196
|
+
setCurrentUpdatePriority(priority) {
|
|
197
|
+
currentUpdatePriority = priority;
|
|
198
|
+
},
|
|
199
|
+
getCurrentUpdatePriority() {
|
|
200
|
+
return currentUpdatePriority;
|
|
201
|
+
},
|
|
202
|
+
resolveUpdatePriority() {
|
|
203
|
+
return currentUpdatePriority;
|
|
204
|
+
},
|
|
205
|
+
scheduleMicrotask(fn) {
|
|
206
|
+
return globalThis.queueMicrotask(fn);
|
|
207
|
+
},
|
|
208
|
+
shouldAttemptEagerTransition() {
|
|
209
|
+
// whether React should try rendering the current event’s transition synchronously.
|
|
210
|
+
// returning true would force always sync rendering, maybe interesting to consider (basically disabling interrupted rendering phase)
|
|
211
|
+
return false;
|
|
212
|
+
},
|
|
213
|
+
// react's scheduler performance tracking
|
|
214
|
+
trackSchedulerEvent() {},
|
|
215
|
+
resolveEventTimeStamp() {
|
|
216
|
+
return performance.now();
|
|
217
|
+
},
|
|
218
|
+
resolveEventType() {
|
|
219
|
+
return null;
|
|
220
|
+
},
|
|
221
|
+
requestPostPaintCallback() {
|
|
222
|
+
// used for scheduling tracing
|
|
223
|
+
},
|
|
224
|
+
//#endregion
|
|
225
|
+
|
|
226
|
+
//#region suspension
|
|
227
|
+
maySuspendCommit() {
|
|
228
|
+
return false;
|
|
229
|
+
},
|
|
230
|
+
preloadInstance() {
|
|
231
|
+
return false;
|
|
232
|
+
},
|
|
233
|
+
startSuspendingCommit() {},
|
|
234
|
+
suspendInstance() {},
|
|
235
|
+
waitForCommitToBeReady() {
|
|
236
|
+
return null;
|
|
237
|
+
},
|
|
238
|
+
//#endregion
|
|
239
|
+
|
|
240
|
+
//#region not sure what those methods are yet
|
|
241
|
+
getInstanceFromNode() {
|
|
242
|
+
throw new Error("TODO: called getInstanceFromNode");
|
|
243
|
+
},
|
|
244
|
+
beforeActiveInstanceBlur() {},
|
|
245
|
+
afterActiveInstanceBlur() {},
|
|
246
|
+
prepareScopeUpdate() {
|
|
247
|
+
throw new Error("TODO: called prepareScopeUpdate");
|
|
248
|
+
},
|
|
249
|
+
getInstanceFromScope() {
|
|
250
|
+
throw new Error("TODO: called getInstanceFromScope");
|
|
251
|
+
},
|
|
252
|
+
//#endregion
|
|
253
|
+
|
|
254
|
+
//#region irrelevant for mobile
|
|
255
|
+
resetFormInstance() {},
|
|
256
|
+
NotPendingTransition: null,
|
|
257
|
+
HostTransitionContext: {
|
|
258
|
+
$$typeof: Symbol.for("react.context"),
|
|
259
|
+
// @ts-expect-error Wrongly typed, null is fine here
|
|
260
|
+
Provider: null,
|
|
261
|
+
// @ts-expect-error Wrongly typed, null is fine here
|
|
262
|
+
Consumer: null,
|
|
263
|
+
_currentValue: null,
|
|
264
|
+
_currentValue2: null,
|
|
265
|
+
_threadCount: 0,
|
|
266
|
+
},
|
|
267
|
+
//#endregion
|
|
268
|
+
};
|
|
269
|
+
|
|
270
|
+
function applyLayout(node: YGNodeRef): void {
|
|
271
|
+
const hasNewLayout = yoga.YGNodeGetHasNewLayout(node);
|
|
272
|
+
if (hasNewLayout === false) {
|
|
273
|
+
return;
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
const x = yoga.YGNodeLayoutGetLeft(node);
|
|
277
|
+
const y = yoga.YGNodeLayoutGetTop(node);
|
|
278
|
+
const width = yoga.YGNodeLayoutGetWidth(node);
|
|
279
|
+
const height = yoga.YGNodeLayoutGetHeight(node);
|
|
280
|
+
|
|
281
|
+
const view = yogaNodeToViewMap.get(node);
|
|
282
|
+
if (view == null) {
|
|
283
|
+
throw new Error("View not found for yoga node");
|
|
284
|
+
}
|
|
285
|
+
view.setFrame({ x, y, width, height });
|
|
286
|
+
yoga.YGNodeSetHasNewLayout(node, false);
|
|
287
|
+
|
|
288
|
+
const childCount = yoga.YGNodeGetChildCount(node);
|
|
289
|
+
for (let index = 0; index < childCount; index++) {
|
|
290
|
+
const child = yoga.YGNodeGetChild(node, index);
|
|
291
|
+
applyLayout(child);
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
return createReconciler(HostConfig);
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
function appendChild(parent: View, child: View): void {
|
|
299
|
+
const parentYogaNode = getViewYogaNode(parent);
|
|
300
|
+
const childYogaNode = getViewYogaNode(child);
|
|
301
|
+
const previousParent = child.parent;
|
|
302
|
+
|
|
303
|
+
parent.appendChild(child);
|
|
304
|
+
detachYogaChild(previousParent, childYogaNode);
|
|
305
|
+
const index = yoga.YGNodeGetChildCount(parentYogaNode);
|
|
306
|
+
yoga.YGNodeInsertChild(parentYogaNode, childYogaNode, index);
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
function insertBefore(parent: View, child: View, beforeChild: View): void {
|
|
310
|
+
const parentYogaNode = getViewYogaNode(parent);
|
|
311
|
+
const childYogaNode = getViewYogaNode(child);
|
|
312
|
+
const beforeChildYogaNode = getViewYogaNode(beforeChild);
|
|
313
|
+
if (childYogaNode === beforeChildYogaNode) {
|
|
314
|
+
return;
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
const childCount = yoga.YGNodeGetChildCount(parentYogaNode);
|
|
318
|
+
let insertionIndex = 0;
|
|
319
|
+
for (let index = 0; index < childCount; index++) {
|
|
320
|
+
const sibling = yoga.YGNodeGetChild(parentYogaNode, index);
|
|
321
|
+
if (sibling === beforeChildYogaNode) {
|
|
322
|
+
const previousParent = child.parent;
|
|
323
|
+
parent.insertBefore(child, beforeChild);
|
|
324
|
+
detachYogaChild(previousParent, childYogaNode);
|
|
325
|
+
yoga.YGNodeInsertChild(parentYogaNode, childYogaNode, insertionIndex);
|
|
326
|
+
return;
|
|
327
|
+
}
|
|
328
|
+
// Moving a child removes its old slot before the insertion takes place.
|
|
329
|
+
if (sibling !== childYogaNode) {
|
|
330
|
+
insertionIndex++;
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
throw new Error("Cannot insert child: beforeChild is not a child of the parent");
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
function detachYogaChild(parent: View | undefined, child: YGNodeRef): void {
|
|
338
|
+
if (parent == null) {
|
|
339
|
+
return;
|
|
340
|
+
}
|
|
341
|
+
const parentYogaNode = getViewYogaNode(parent);
|
|
342
|
+
const owner = yoga.YGNodeGetOwner(child);
|
|
343
|
+
if (owner === parentYogaNode) {
|
|
344
|
+
yoga.YGNodeRemoveChild(parentYogaNode, child);
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
const updatePropsOnView = ((
|
|
349
|
+
view: View,
|
|
350
|
+
type: ReconcilerElementType,
|
|
351
|
+
props: ReconcilerProps,
|
|
352
|
+
prevProps?: ReconcilerProps,
|
|
353
|
+
) => {
|
|
354
|
+
const propSetters = reconcilerViewRegistry.propSetters[type]
|
|
355
|
+
|
|
356
|
+
// Check if a prop has been removed
|
|
357
|
+
if (prevProps != null) {
|
|
358
|
+
for (const key in prevProps) {
|
|
359
|
+
if (key in props) {
|
|
360
|
+
continue
|
|
361
|
+
}
|
|
362
|
+
if (prevProps[key] === undefined) {
|
|
363
|
+
continue
|
|
364
|
+
}
|
|
365
|
+
// Prop was reset / removed:
|
|
366
|
+
const propSetter = propSetters?.[key]
|
|
367
|
+
if (propSetter != null) {
|
|
368
|
+
propSetter(view, undefined, prevProps[key])
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
// A performance benchmark showed that Hermes favored scanning present keys
|
|
374
|
+
// over Object.keys() allocations or checking every supported prop.
|
|
375
|
+
for (const key in props) {
|
|
376
|
+
const propSetter = propSetters?.[key]
|
|
377
|
+
if (propSetter == null) {
|
|
378
|
+
continue
|
|
379
|
+
}
|
|
380
|
+
const propValue = props[key]
|
|
381
|
+
const previousPropValue = prevProps?.[key]
|
|
382
|
+
if (propValue === previousPropValue) {
|
|
383
|
+
continue
|
|
384
|
+
}
|
|
385
|
+
const isArray = Array.isArray(propValue)
|
|
386
|
+
const wasArray = Array.isArray(previousPropValue)
|
|
387
|
+
if (isArray && wasArray) {
|
|
388
|
+
const sameArray = arePropArraysEqual(propValue, previousPropValue)
|
|
389
|
+
if (sameArray) {
|
|
390
|
+
continue
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
propSetter(view, propValue, previousPropValue)
|
|
394
|
+
}
|
|
395
|
+
view.afterUpdate();
|
|
396
|
+
});
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
export type PropSetter<Target, Props extends object> = (
|
|
2
|
+
target: Target,
|
|
3
|
+
props: Props,
|
|
4
|
+
propName: keyof Props,
|
|
5
|
+
previousProps?: Props,
|
|
6
|
+
) => void;
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Takes an array of prop names, and a setter function.
|
|
10
|
+
* Whenever one of the props in the group changes, the setter function will be called with all props.
|
|
11
|
+
*/
|
|
12
|
+
export function groupPropSetter<Target, Props extends object>(
|
|
13
|
+
propNames: readonly (keyof Props)[],
|
|
14
|
+
setter: (target: Target, props: Props) => void,
|
|
15
|
+
): PropSetter<Target, Props> {
|
|
16
|
+
return (target, props, propName, previousProps) => {
|
|
17
|
+
for (const groupedPropName of propNames) {
|
|
18
|
+
const value = props[groupedPropName];
|
|
19
|
+
const previousValue = previousProps?.[groupedPropName];
|
|
20
|
+
if (value === previousValue) {
|
|
21
|
+
continue;
|
|
22
|
+
}
|
|
23
|
+
if (propName === groupedPropName) {
|
|
24
|
+
setter(target, props);
|
|
25
|
+
}
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
}
|