From 7650714b381c45f19348fcacc4f235660ee89eb0 Mon Sep 17 00:00:00 2001 From: Saransh977 Date: Wed, 8 Oct 2025 23:23:59 +0530 Subject: [PATCH 1/5] added new architech support (#122) --- .../HyperFragmentViewManager.java | 66 ++++++++++++++ ios/HyperSdkReact.mm | 87 ++++++++++++++++++- src/HyperFragmentView.tsx | 18 +++- 3 files changed, 165 insertions(+), 6 deletions(-) diff --git a/android/src/main/java/in/juspay/hypersdkreact/HyperFragmentViewManager.java b/android/src/main/java/in/juspay/hypersdkreact/HyperFragmentViewManager.java index 7bcf009..7f982c4 100644 --- a/android/src/main/java/in/juspay/hypersdkreact/HyperFragmentViewManager.java +++ b/android/src/main/java/in/juspay/hypersdkreact/HyperFragmentViewManager.java @@ -21,6 +21,7 @@ import com.facebook.react.common.MapBuilder; import com.facebook.react.uimanager.ThemedReactContext; import com.facebook.react.uimanager.ViewGroupManager; +import com.facebook.react.uimanager.annotations.ReactProp; import org.json.JSONObject; @@ -35,6 +36,13 @@ public class HyperFragmentViewManager extends ViewGroupManager { private static final int COMMAND_PROCESS = 175; private final ReactApplicationContext reactContext; + // Track props for each view + private String currentNamespace = null; + private String currentPayload = null; + private FrameLayout currentView = null; + + // Architecture detection + private final Boolean newArchEnabled = BuildConfig.IS_NEW_ARCHITECTURE_ENABLED; public HyperFragmentViewManager(ReactApplicationContext reactContext) { this.reactContext = reactContext; @@ -58,6 +66,64 @@ protected FrameLayout createViewInstance(@NonNull ThemedReactContext context) { public Map getCommandsMap() { return MapBuilder.of("process", COMMAND_PROCESS); } + // Fabric-compatible props + @ReactProp(name = "ns") + public void setNs(FrameLayout view, @Nullable String ns) { + currentNamespace = ns; + currentView = view; + tryProcessProps(); + } + + @ReactProp(name="height") + public void setHeight(FrameLayout view, @Nullable int height) { + + } + @ReactProp(name = "payload") + public void setPayload(FrameLayout view, @Nullable String payload) { + currentPayload = payload; + currentView = view; + tryProcessProps(); + } + + + private void tryProcessProps() { + if (currentNamespace != null && currentPayload != null && currentView != null && newArchEnabled) { + currentView.post(() -> { + processWithProps(currentView, currentNamespace, currentPayload); + }); + } + } + + private void processWithProps(FrameLayout view, String namespace, String payload) { + try { + setupLayout(view); + + JSONObject fragments = new JSONObject(); + fragments.put(namespace, view); + + JSONObject payloadObj = new JSONObject(payload); + payloadObj.getJSONObject("payload").put("fragmentViewGroups", fragments); + + FragmentActivity activity = (FragmentActivity) reactContext.getCurrentActivity(); + HyperServices hyperServices = HyperSdkReactModule.getHyperServices(); + + if (activity == null || hyperServices == null) { + return; + } + + hyperServices.process(activity, payloadObj); + + } catch (Exception e) { + SdkTracker.trackAndLogBootException( + NAME, + LogConstants.CATEGORY_LIFECYCLE, + LogConstants.SUBCATEGORY_HYPER_SDK, + LogConstants.SDK_TRACKER_LABEL, + "Exception in processWithProps", + e + ); + } + } @Override public void receiveCommand(@NonNull FrameLayout root, String commandId, @Nullable ReadableArray args) { diff --git a/ios/HyperSdkReact.mm b/ios/HyperSdkReact.mm index ca3ad01..95bf450 100644 --- a/ios/HyperSdkReact.mm +++ b/ios/HyperSdkReact.mm @@ -439,7 +439,13 @@ + (NSString*)dictionaryToString:(id)dict{ @end @implementation HyperFragmentViewManagerIOS -RCT_EXPORT_MODULE() + + +RCT_EXPORT_MODULE(HyperFragmentViewManagerIOS) + +NSString *_currentNamespace; +NSString *_currentPayload; +UIView *_currentView; - (dispatch_queue_t)methodQueue{ return dispatch_get_main_queue(); @@ -454,7 +460,81 @@ - (UIView *)view return [[UIView alloc] init]; } -RCT_EXPORT_METHOD(process:(nonnull NSNumber *)viewTag nameSpace:(NSString *)nameSpace payload:(NSString *)payload) + +RCT_CUSTOM_VIEW_PROPERTY(ns, NSString, UIView) +{ + [self setNs:json forView:view]; +} + +RCT_CUSTOM_VIEW_PROPERTY(payload, NSString, UIView) +{ + [self setPayload:json forView:view]; +} + + +- (void) setHeight:(NSString*)ns forView:(UIView*)view { + +} + +- (void) setWidth:(NSString*)ns forView:(UIView*)view { + +} +- (void)setNs:(NSString *)ns forView:(UIView *)view +{ + _currentNamespace = ns; + _currentView = view; + [self tryProcessProps]; +} + + +- (void)setPayload:(NSString *)payload forView:(UIView *)view +{ + _currentPayload = payload; + _currentView = view; + [self tryProcessProps]; +} + +- (void)tryProcessProps +{ + if (_currentNamespace && _currentPayload && _currentView) { + dispatch_async(dispatch_get_main_queue(), ^{ + [self processWithPropsForView:_currentView ns:_currentNamespace payload:_currentPayload]; + }); + } +} + +- (void)processWithPropsForView:(UIView *)view ns:(NSString *)ns payload:(NSString *)payload +{ + HyperServices *hyperServicesInstance = _hyperServicesReference; + if (payload && payload.length > 0) { + @try { + NSDictionary *jsonData = [HyperSdkReact stringToDictionary:payload]; + if (jsonData && [jsonData isKindOfClass:[NSDictionary class]] && jsonData.allKeys.count > 0) { + if (hyperServicesInstance.baseViewController == nil || hyperServicesInstance.baseViewController.view.window == nil) { + id baseViewController = RCTPresentedViewController(); + if ([baseViewController isMemberOfClass:RCTModalHostViewController.class] && [baseViewController presentingViewController]) { + [hyperServicesInstance setBaseViewController:[baseViewController presentingViewController]]; + } else { + [hyperServicesInstance setBaseViewController:baseViewController]; + } + } + + [self manuallyLayoutChildren:view]; + + NSMutableDictionary *nestedPayload = [jsonData[@"payload"] mutableCopy]; + NSDictionary *fragmentViewGroup = @{ns: view}; + nestedPayload[@"fragmentViewGroups"] = fragmentViewGroup; + NSMutableDictionary *updatedJsonData = [jsonData mutableCopy]; + updatedJsonData[@"payload"] = nestedPayload; + [hyperServicesInstance process:[updatedJsonData copy]]; + } + } @catch (NSException *exception) { + // Handle exception silently + } + } +} + +RCT_EXPORT_METHOD(process:(nonnull NSNumber *)viewTag ns:(NSString *)ns payload:(NSString *)payload) { HyperServices *hyperServicesInstance = _hyperServicesReference; if (payload && payload.length>0) { @@ -477,7 +557,7 @@ - (UIView *)view return; } NSMutableDictionary *nestedPayload = [jsonData[@"payload"] mutableCopy]; - NSDictionary *fragmentViewGroup = @{nameSpace: view}; + NSDictionary *fragmentViewGroup = @{ns: view}; nestedPayload[@"fragmentViewGroups"] = fragmentViewGroup; NSMutableDictionary *updatedJsonData = [jsonData mutableCopy]; updatedJsonData[@"payload"] = nestedPayload; @@ -496,4 +576,3 @@ - (void)manuallyLayoutChildren:(UIView *)view { } @end - diff --git a/src/HyperFragmentView.tsx b/src/HyperFragmentView.tsx index 7861b57..c3c2d0c 100644 --- a/src/HyperFragmentView.tsx +++ b/src/HyperFragmentView.tsx @@ -30,8 +30,11 @@ if (Platform.OS === 'android') { ); } +const newArchEnabled = false; + const createFragment = (viewId: number, namespace: string, payload: string) => { - if (Platform.OS === 'android') { + if(!newArchEnabled) { + if (Platform.OS === 'android') { UIManager.dispatchViewManagerCommand( viewId, //@ts-ignore @@ -49,6 +52,9 @@ const createFragment = (viewId: number, namespace: string, payload: string) => { ]); } } + + } + }; const HyperFragmentView: React.FC = ({ @@ -71,7 +77,15 @@ const HyperFragmentView: React.FC = ({ return ( - + {newArchEnabled?:} ); }; From 44603d0920e29c13fc3b9720f8e823546b703bc9 Mon Sep 17 00:00:00 2001 From: Saransh977 Date: Thu, 9 Oct 2025 13:31:21 +0530 Subject: [PATCH 2/5] Fix new arch condition (#125) --- src/HyperFragmentView.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/HyperFragmentView.tsx b/src/HyperFragmentView.tsx index c3c2d0c..fb90b53 100644 --- a/src/HyperFragmentView.tsx +++ b/src/HyperFragmentView.tsx @@ -30,7 +30,7 @@ if (Platform.OS === 'android') { ); } -const newArchEnabled = false; +const newArchEnabled = global?.nativeFabricUIManager ? true : false; const createFragment = (viewId: number, namespace: string, payload: string) => { if(!newArchEnabled) { From 0908952854caee9d0798996d48ffbae203ccb56b Mon Sep 17 00:00:00 2001 From: Charan-Juspay Date: Fri, 10 Oct 2025 01:40:18 +0530 Subject: [PATCH 3/5] fix: android size for fragment in new arch --- .../HyperFragmentViewManager.java | 33 +++++++++-- src/HyperFragmentView.tsx | 57 +++++++++---------- 2 files changed, 55 insertions(+), 35 deletions(-) diff --git a/android/src/main/java/in/juspay/hypersdkreact/HyperFragmentViewManager.java b/android/src/main/java/in/juspay/hypersdkreact/HyperFragmentViewManager.java index 7f982c4..5b34477 100644 --- a/android/src/main/java/in/juspay/hypersdkreact/HyperFragmentViewManager.java +++ b/android/src/main/java/in/juspay/hypersdkreact/HyperFragmentViewManager.java @@ -74,17 +74,20 @@ public void setNs(FrameLayout view, @Nullable String ns) { tryProcessProps(); } - @ReactProp(name="height") - public void setHeight(FrameLayout view, @Nullable int height) { - - } @ReactProp(name = "payload") public void setPayload(FrameLayout view, @Nullable String payload) { currentPayload = payload; currentView = view; tryProcessProps(); } - + + @Override + public void onDropViewInstance(@NonNull FrameLayout view) { + super.onDropViewInstance(view); + currentNamespace = null; + currentPayload = null; + currentView = null; + } private void tryProcessProps() { if (currentNamespace != null && currentPayload != null && currentView != null && newArchEnabled) { @@ -188,7 +191,11 @@ private void setupLayout(View view) { @Override public void doFrame(long frameTimeNanos) { try { - manuallyLayoutChildren(view); + if (newArchEnabled) { + manuallyLayoutChildrenForNewArch(view); + } else { + manuallyLayoutChildren(view); + } view.getViewTreeObserver().dispatchOnGlobalLayout(); Choreographer.getInstance().postFrameCallback(this); } catch (Exception e) { @@ -218,4 +225,18 @@ private void manuallyLayoutChildren(@NonNull View view) { view.layout(0, 0, width, height); } + + private void manuallyLayoutChildrenForNewArch(@NonNull View view) { + // Get the final size AND position calculated by React Native's Yoga engine + int width = view.getWidth(); + int height = view.getHeight(); + int left = view.getLeft(); + int top = view.getTop(); + + view.measure( + View.MeasureSpec.makeMeasureSpec(width, View.MeasureSpec.EXACTLY), + View.MeasureSpec.makeMeasureSpec(height, View.MeasureSpec.EXACTLY) + ); + view.layout(left, top, left + width, top + height); + } } diff --git a/src/HyperFragmentView.tsx b/src/HyperFragmentView.tsx index fb90b53..0dbd509 100644 --- a/src/HyperFragmentView.tsx +++ b/src/HyperFragmentView.tsx @@ -30,31 +30,29 @@ if (Platform.OS === 'android') { ); } -const newArchEnabled = global?.nativeFabricUIManager ? true : false; +const newArchEnabled = (global as any)?.nativeFabricUIManager ? true : false; const createFragment = (viewId: number, namespace: string, payload: string) => { - if(!newArchEnabled) { + if (!newArchEnabled) { if (Platform.OS === 'android') { - UIManager.dispatchViewManagerCommand( - viewId, - //@ts-ignore - UIManager.HyperFragmentViewManager.Commands.process.toString(), - [viewId, namespace, payload] - ); - } else { - const commandId = UIManager.getViewManagerConfig( - 'HyperFragmentViewManagerIOS' - ).Commands.process; - if (typeof commandId !== 'undefined') { - UIManager.dispatchViewManagerCommand(viewId, commandId, [ - namespace, - payload, - ]); + UIManager.dispatchViewManagerCommand( + viewId, + //@ts-ignore + UIManager.HyperFragmentViewManager.Commands.process.toString(), + [viewId, namespace, payload] + ); + } else { + const commandId = UIManager.getViewManagerConfig( + 'HyperFragmentViewManagerIOS' + ).Commands.process; + if (typeof commandId !== 'undefined') { + UIManager.dispatchViewManagerCommand(viewId, commandId, [ + namespace, + payload, + ]); + } } } - - } - }; const HyperFragmentView: React.FC = ({ @@ -77,15 +75,16 @@ const HyperFragmentView: React.FC = ({ return ( - {newArchEnabled?:} + {newArchEnabled ? ( + + ) : ( + + )} ); }; From 18f36e30cf130a8858c7f7b4ec98620937adfc00 Mon Sep 17 00:00:00 2001 From: Yaswanth Polisetti Date: Wed, 15 Oct 2025 14:26:17 +0530 Subject: [PATCH 4/5] fix: hyper-sdk-react to work with 0.78 and 0.79 of rn --- ios/HyperSdkReact.mm | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/ios/HyperSdkReact.mm b/ios/HyperSdkReact.mm index 95bf450..727660c 100644 --- a/ios/HyperSdkReact.mm +++ b/ios/HyperSdkReact.mm @@ -17,8 +17,7 @@ #import #import -#if __has_include("RCTAppDelegate.h") && __has_include("RCTRootViewFactory.h") -#import "RCTAppDelegate.h" +#if __has_include("RCTRootViewFactory.h") #import "RCTRootViewFactory.h" #define HAS_NEW_ARCH_SUPPORT 1 #else @@ -189,15 +188,19 @@ - (UIView * _Nullable)merchantViewForViewType:(NSString * _Nonnull)viewType { bool rootFactoryAvailable = false; id appDelegate = RCTSharedApplication().delegate; - rootFactoryAvailable = [appDelegate respondsToSelector:@selector(rootViewFactory)]; + rootFactoryAvailable = [appDelegate respondsToSelector:@selector(reactNativeFactory)]; if (!rootFactoryAvailable) { return oldArchCall(); } - RCTRootViewFactory *factory = ((RCTAppDelegate *)appDelegate).rootViewFactory; - MerchantViewRoot *wrapper = [[MerchantViewRoot alloc] init]; + id factory = [appDelegate performSelector:NSSelectorFromString(@"reactNativeFactory")]; + if (![factory respondsToSelector:NSSelectorFromString(@"rootViewFactory")]) { + return oldArchCall(); + } + RCTRootViewFactory *rootViewFactory = [factory performSelector:NSSelectorFromString(@"rootViewFactory")]; + UIView *rrv = [rootViewFactory viewWithModuleName:moduleName initialProperties:nil]; - UIView *rrv = [factory viewWithModuleName:moduleName initialProperties:nil]; + MerchantViewRoot *wrapper = [[MerchantViewRoot alloc] init]; [wrapper addSubview:rrv]; // Remove background colour. Default colour white is getting applied to the merchant view From 6928dfdf6efd1e3e28d7f31af4500080bfdd1781 Mon Sep 17 00:00:00 2001 From: Yaswanth Polisetti Date: Thu, 16 Oct 2025 17:15:57 +0530 Subject: [PATCH 5/5] fix: merchant view fix in 0.80 and above and plugin compiling on 0.78, 0.79 --- hyper-sdk-react.podspec | 121 +++++++++++++++++++++++++------- ios/HyperMerchantView.h | 21 ++++++ ios/HyperSdkReact.mm | 57 +++++---------- ios/latest/HyperMerchantView.mm | 54 ++++++++++++++ ios/rn77/HyperMerchantView.mm | 37 ++++++++++ 5 files changed, 226 insertions(+), 64 deletions(-) create mode 100644 ios/HyperMerchantView.h create mode 100644 ios/latest/HyperMerchantView.mm create mode 100644 ios/rn77/HyperMerchantView.mm diff --git a/hyper-sdk-react.podspec b/hyper-sdk-react.podspec index 5ecb88a..c14c29e 100644 --- a/hyper-sdk-react.podspec +++ b/hyper-sdk-react.podspec @@ -1,41 +1,110 @@ require "json" package = JSON.parse(File.read(File.join(__dir__, "package.json"))) + +rn_minor_version = 0 + [ + '../react-native/package.json', + '../../react-native/package.json', + '../../../react-native/package.json', + ].each do |relative_path| + if rn_minor_version == 0 + path = File.join(__dir__, relative_path) + if File.exist?(path) + begin + package1 = JSON.parse(File.read(path)) + version = package1 ['version'] + if version == '*' || version.include?('*') + rn_minor_version = 80 + else + rn_minor_version = version.split('.')[1].to_i + end + break + rescue => e + end + end + end + end + +#Fallback - search in common locations +if rn_minor_version == 0 + common_paths = [ + File.expand_path('node_modules/react-native/package.json', Dir.pwd), + File.expand_path('../../node_modules/react-native/package.json', __dir__), + ] + common_paths.each do |path| + if File.exist?(path) + begin + package1 = JSON.parse(File.read(path)) + version = package1 ['version'] + if version == '*' || version.include?('*') + rn_minor_version = 80 + else + rn_minor_version = version.split('.')[1].to_i + end + break + rescue => e + end + end + end +end + +# Fallback if still not found +if rn_minor_version == 0 + rn_minor_version = 77 +end +puts ("Found react native minor version as #{rn_minor_version}").yellow + folly_compiler_flags = '-DFOLLY_NO_CONFIG -DFOLLY_MOBILE=1 -DFOLLY_USE_LIBCPP=1 -Wno-comma -Wno-shorten-64-to-32' hyper_sdk_version = "2.2.2.8" begin - package_json_path = File.expand_path(File.join(__dir__, "../../package.json")) - apps_package = JSON.parse(File.read(package_json_path)) - if apps_package["hyperSdkIOSVersion"] - override_version = apps_package["hyperSdkIOSVersion"] - hyper_sdk_version = Gem::Version.new(override_version) > Gem::Version.new(hyper_sdk_version) ? override_version : hyper_sdk_version - if hyper_sdk_version != override_version - puts ("Ignoring the overriden SDK version present in package.json (#{override_version}) as there is a newer version present in the SDK (#{hyper_sdk_version}).").yellow - end - end + package_json_path = File.expand_path(File.join(__dir__, "../../package.json")) + apps_package = JSON.parse(File.read(package_json_path)) + if apps_package["hyperSdkIOSVersion"] + override_version = apps_package["hyperSdkIOSVersion"] + hyper_sdk_version = Gem::Version.new(override_version) > Gem::Version.new(hyper_sdk_version) ? override_version : hyper_sdk_version + if hyper_sdk_version != override_version + puts ("Ignoring the overriden SDK version present in package.json (#{override_version}) as there is a newer version present in the SDK (#{hyper_sdk_version}).").yellow + end + end rescue => e - puts ("An error occurred while overrding the IOS SDK Version. #{e.message}").red + puts ("An error occurred while overrding the IOS SDK Version. #{e.message}").red end puts ("HyperSDK Version: #{hyper_sdk_version}") +# Prepare source files based on RN version +source_files_array = ["ios/**/*.{h,m,mm,swift}"] +exclude_files = [] + +if rn_minor_version >= 78 + source_files_array << "ios/latest/**/*.{h,m,mm,swift}" + exclude_files << "ios/rn77/**/*" +else + source_files_array << "ios/rn77/**/*.{h,m,mm,swift}" + exclude_files << "ios/latest/**/*" +end + Pod::Spec.new do |s| - s.name = "hyper-sdk-react" - s.version = package["version"] - s.summary = package["description"] - s.homepage = package["homepage"] - s.license = package["license"] - s.authors = package["author"] - - s.platforms = { :ios => "12.0" } - s.source = { :git => "https://github.com/juspay/hyper-sdk-react.git", :tag => "v#{s.version}" } - - s.static_framework = true - s.source_files = "ios/**/*.{h,m,mm,swift}" - - s.dependency "React-Core" - s.dependency "React-RCTAppDelegate" - s.dependency "HyperSDK", hyper_sdk_version + s.name = "hyper-sdk-react" + s.version = package["version"] + s.summary = package["description"] + s.homepage = package["homepage"] + s.license = package["license"] + s.authors = package["author"] + + s.platforms = { :ios => "12.0" } + s.source = { :git => "https://github.com/juspay/hyper-sdk-react.git", :tag => "v#{s.version}" } + + s.static_framework = true + s.source_files = source_files_array + + # Set exclude files + s.exclude_files = exclude_files + + s.dependency "React-Core" + s.dependency "React-RCTAppDelegate" + s.dependency "HyperSDK", hyper_sdk_version end diff --git a/ios/HyperMerchantView.h b/ios/HyperMerchantView.h new file mode 100644 index 0000000..c12d3c5 --- /dev/null +++ b/ios/HyperMerchantView.h @@ -0,0 +1,21 @@ +// +// HyperMerchantView.h +// Pods +// +// Created by Yaswanth Polisetti on 16/10/25. +// + + +// HyperMerchantView.h +#ifndef HyperMerchantView_h +#define HyperMerchantView_h + +#import + +@interface HyperMerchantView : UIView + ++ (UIView *)createReactNativeViewWithModuleName:(NSString *)moduleName; + +@end + +#endif diff --git a/ios/HyperSdkReact.mm b/ios/HyperSdkReact.mm index 727660c..d280835 100644 --- a/ios/HyperSdkReact.mm +++ b/ios/HyperSdkReact.mm @@ -17,12 +17,7 @@ #import #import -#if __has_include("RCTRootViewFactory.h") -#import "RCTRootViewFactory.h" -#define HAS_NEW_ARCH_SUPPORT 1 -#else -#define HAS_NEW_ARCH_SUPPORT 0 -#endif +#import "HyperMerchantView.h" __weak static HyperServices *_hyperServicesReference; @@ -183,43 +178,29 @@ - (UIView * _Nullable)merchantViewForViewType:(NSString * _Nonnull)viewType { return rrv; }; + UIView *rrv = [HyperMerchantView createReactNativeViewWithModuleName:moduleName]; - #if HAS_NEW_ARCH_SUPPORT - - bool rootFactoryAvailable = false; - id appDelegate = RCTSharedApplication().delegate; - rootFactoryAvailable = [appDelegate respondsToSelector:@selector(reactNativeFactory)]; - if (!rootFactoryAvailable) { - return oldArchCall(); - } - - id factory = [appDelegate performSelector:NSSelectorFromString(@"reactNativeFactory")]; - if (![factory respondsToSelector:NSSelectorFromString(@"rootViewFactory")]) { - return oldArchCall(); - } - RCTRootViewFactory *rootViewFactory = [factory performSelector:NSSelectorFromString(@"rootViewFactory")]; - UIView *rrv = [rootViewFactory viewWithModuleName:moduleName initialProperties:nil]; + if (rrv == nil) { + return oldArchCall(); + } + MerchantViewRoot *wrapper = [[MerchantViewRoot alloc] init]; + [wrapper addSubview:rrv]; - MerchantViewRoot *wrapper = [[MerchantViewRoot alloc] init]; - [wrapper addSubview:rrv]; - - // Remove background colour. Default colour white is getting applied to the merchant view - wrapper.backgroundColor = UIColor.clearColor ; - - // Remove height 0, width 0 constraints added by default. - wrapper.translatesAutoresizingMaskIntoConstraints = false; - - rrv.translatesAutoresizingMaskIntoConstraints = false; + + // Remove background colour. Default colour white is getting applied to the merchant view + wrapper.backgroundColor = UIColor.clearColor ; + + // Remove height 0, width 0 constraints added by default. + wrapper.translatesAutoresizingMaskIntoConstraints = false; + + rrv.translatesAutoresizingMaskIntoConstraints = false; - [self.rootHolder setObject:wrapper forKey:moduleName]; - addHeightConstraint(wrapper); + [self.rootHolder setObject:wrapper forKey:moduleName]; + addHeightConstraint(wrapper); - // This is sent to hypersdk. Hyper sdk adds the view to it's heirarchy and set's superview's top and bottom to match rrv's top and bottom - return wrapper; - #else - return oldArchCall(); - #endif + // This is sent to hypersdk. Hyper sdk adds the view to it's heirarchy and set's superview's top and bottom to match rrv's top and bottom + return wrapper; } - (void) onWebViewReady:(WKWebView *)webView { diff --git a/ios/latest/HyperMerchantView.mm b/ios/latest/HyperMerchantView.mm new file mode 100644 index 0000000..7940c52 --- /dev/null +++ b/ios/latest/HyperMerchantView.mm @@ -0,0 +1,54 @@ +// +// HyperMerchantView.mm +// Pods +// +// Created by Yaswanth Polisetti on 16/10/25. +// +// HyperMerchantView.mm +#import "HyperMerchantView.h" +#import +#if __has_include("RCTRootViewFactory.h") +#import "RCTRootViewFactory.h" +#define HAS_NEW_ARCH_SUPPORT 1 +#else +#define HAS_NEW_ARCH_SUPPORT 0 +#endif + +@implementation HyperMerchantView ++ (UIView *)createReactNativeViewWithModuleName:(NSString *)moduleName { + + #if HAS_NEW_ARCH_SUPPORT + id appDelegate = RCTSharedApplication().delegate; + unsigned int ivarCount = 0; + Ivar *ivars = class_copyIvarList([appDelegate class], &ivarCount); + id factory = nil; + for (unsigned int i = 0; i < ivarCount; i++) { + const char *ivarName = ivar_getName(ivars[i]); + // Swift mangles property names - look for reactNativeFactory or _reactNativeFactory + if (strcmp(ivarName, "_reactNativeFactory") == 0 || strcmp(ivarName, "reactNativeFactory") == 0) { + factory = object_getIvar(appDelegate, ivars[i]); + break; + } + } + free(ivars); + if (!factory) { + return nil; + } + // Now use the factory + if (![factory respondsToSelector:@selector(rootViewFactory)]) { + return nil; + } + id rootViewFactory = [factory performSelector:@selector(rootViewFactory)]; + if (![rootViewFactory respondsToSelector:@selector(viewWithModuleName:initialProperties:)]) { + return nil; + } + UIView *rrv = [rootViewFactory performSelector:@selector(viewWithModuleName:initialProperties:) + withObject:moduleName + withObject:nil]; + + return rrv; + #else + return nil; + #endif +} +@end diff --git a/ios/rn77/HyperMerchantView.mm b/ios/rn77/HyperMerchantView.mm new file mode 100644 index 0000000..8aff7c2 --- /dev/null +++ b/ios/rn77/HyperMerchantView.mm @@ -0,0 +1,37 @@ +// +// HyperMerchantView.mm +// Pods +// +// Created by Yaswanth Polisetti on 16/10/25. +// +// HyperMerchantView.mm +#import "HyperMerchantView.h" +#import + +#if __has_include("RCTAppDelegate.h") && __has_include("RCTRootViewFactory.h") +#import "RCTAppDelegate.h" +#import "RCTRootViewFactory.h" +#define HAS_NEW_ARCH_SUPPORT 1 +#else +#define HAS_NEW_ARCH_SUPPORT 0 +#endif + +@implementation HyperMerchantView ++ (UIView *)createReactNativeViewWithModuleName:(NSString *)moduleName { + + #if HAS_NEW_ARCH_SUPPORT + + bool rootFactoryAvailable = false; + id appDelegate = RCTSharedApplication().delegate; + rootFactoryAvailable = [appDelegate respondsToSelector:@selector(rootViewFactory)]; + if (!rootFactoryAvailable) { + return nil; + } + RCTRootViewFactory *factory = ((RCTAppDelegate *)appDelegate).rootViewFactory; + UIView *rrv = [factory viewWithModuleName:moduleName initialProperties:nil]; + return rrv; + #else + return nil; + #endif +} +@end