Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix: VisionCamera session is not deinitialized/recycled when screen gets unmounted on native-stack #49936

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@chrispader can you please create an issue in Expensify and link it here that will track removing these patches once we add support upstream? We can then make it monthly and make sure this gets done over time

File renamed without changes.
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
diff --git a/node_modules/react-native-vision-camera/ios/RNCameraView.mm b/node_modules/react-native-vision-camera/ios/RNCameraView.mm
index b90427e..0be4171 100644
--- a/node_modules/react-native-vision-camera/ios/RNCameraView.mm
+++ b/node_modules/react-native-vision-camera/ios/RNCameraView.mm
@@ -34,26 +34,43 @@ + (ComponentDescriptorProvider)componentDescriptorProvider
return concreteComponentDescriptorProvider<CameraViewComponentDescriptor>();
}

-- (instancetype)initWithFrame:(CGRect)frame
-{
- self = [super initWithFrame:frame];
-if (self) {
- static const auto defaultProps = std::make_shared<const CameraViewProps>();
+- (void) initCamera {
+ static const auto defaultProps = std::make_shared<const CameraViewProps>();
_props = defaultProps;

- //The remaining part of the initializer is standard Objective-C code to create views and layout them with AutoLayout. Here we can change whatever we want to.
+ // The remaining part of the initializer is standard bjective-C code to create views and layout them with utoLayout. Here we can change whatever we want to.
_view = [[CameraView alloc] init];
_view.delegate = self;

self.contentView = _view;
}

-return self;
+- (instancetype)initWithFrame:(CGRect)frame
+{
+ self = [super initWithFrame:frame];
+ if (self) {
+ [self initCamera];
+ }
+
+ return self;
+}
+
+- (void) prepareForRecycle {
+ [super prepareForRecycle];
+
+ self.contentView = _view;
+ _view.delegate = nil;
+ _view = nil;
+ self.contentView = nil;
}

// why we need this func -> https://reactnative.dev/docs/next/the-new-architecture/pillars-fabric-components#write-the-native-ios-code
- (void)updateProps:(Props::Shared const &)props oldProps:(Props::Shared const &)oldProps
{
+ if (_view == nil) {
+ [self initCamera];
+ }
+
const auto &newViewProps = *std::static_pointer_cast<CameraViewProps const>(props);
const auto &oldViewProps = *std::static_pointer_cast<CameraViewProps const>(_props);

Loading