Skip to content
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
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand All @@ -35,6 +36,13 @@ public class HyperFragmentViewManager extends ViewGroupManager<FrameLayout> {
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;
Expand All @@ -58,6 +66,67 @@ protected FrameLayout createViewInstance(@NonNull ThemedReactContext context) {
public Map<String, Integer> 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 = "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) {
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) {
Expand Down Expand Up @@ -122,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) {
Expand Down Expand Up @@ -152,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);
}
}
121 changes: 95 additions & 26 deletions hyper-sdk-react.podspec
Original file line number Diff line number Diff line change
@@ -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
21 changes: 21 additions & 0 deletions ios/HyperMerchantView.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
//
// HyperMerchantView.h
// Pods
//
// Created by Yaswanth Polisetti on 16/10/25.
//


// HyperMerchantView.h
#ifndef HyperMerchantView_h
#define HyperMerchantView_h

#import <UIKit/UIKit.h>

@interface HyperMerchantView : UIView

+ (UIView *)createReactNativeViewWithModuleName:(NSString *)moduleName;

@end

#endif
Loading
Loading