1// Copyright 2018-present 650 Industries. All rights reserved.
2
3#import <EXDevLauncher/EXRCTAppDelegateInterceptor.h>
4
5#import <memory>
6#import <cxxreact/JSExecutor.h>
7#import <React/RCTCxxBridgeDelegate.h>
8
9#if __has_include(<RNReanimated/REAInitializer.h>)
10#import <RNReanimated/REAInitializer.h>
11#endif // __has_include(<RNReanimated/REAInitializer.h>)
12
13@interface DevClientAppDelegate () <RCTCxxBridgeDelegate>
14@end
15
16@implementation EXRCTAppDelegateInterceptor
17
18- (instancetype)initWithBridgeDelegate:(id<RCTBridgeDelegate>)bridgeDelegate interceptor:(id<RCTBridgeDelegate>)interceptor
19{
20  if (self = [super init]) {
21    self.bridgeDelegate = bridgeDelegate;
22    self.interceptor = interceptor;
23  }
24  return self;
25}
26
27- (BOOL)conformsToProtocol:(Protocol *)protocol
28{
29  return [self.bridgeDelegate conformsToProtocol:protocol];
30}
31
32- (id)forwardingTargetForSelector:(SEL)selector
33{
34  if ([self isInterceptedSelector:selector]) {
35    return self;
36  }
37  return self.bridgeDelegate;
38}
39
40- (BOOL)respondsToSelector:(SEL)selector
41{
42  if ([self isInterceptedSelector:selector]) {
43    return YES;
44  }
45  return [self.bridgeDelegate respondsToSelector:selector];
46}
47
48- (BOOL)isInterceptedSelector:(SEL)selector
49{
50  if ([self.interceptor respondsToSelector:selector]) {
51    return YES;
52  }
53  return NO;
54}
55
56- (NSURL *)sourceURLForBridge:(RCTBridge *)bridge {
57  return [self.interceptor sourceURLForBridge:bridge];
58}
59
60- (std::unique_ptr<facebook::react::JSExecutorFactory>)jsExecutorFactoryForBridge:(RCTBridge *)bridge
61{
62#if __has_include(<RNReanimated/REAInitializer.h>) \
63  && __has_include(<RNReanimated/UIResponder+Reanimated.h>) /* removed in [email protected] */ \
64  && !RCT_NEW_ARCH_ENABLED
65  // required and available only for react-native-reanimated < 3.4.0
66  reanimated::REAInitializer(bridge);
67#endif
68
69  return [super jsExecutorFactoryForBridge:bridge];
70}
71
72@end
73