1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127package io.hyperswitch
import android.app.Activity
import android.app.Application
import android.os.Bundle
import androidx.fragment.app.FragmentActivity
import androidx.fragment.app.FragmentManager
import androidx.fragment.app.FragmentTransaction
import com.facebook.react.PackageList
import com.facebook.react.ReactFragment
import com.facebook.react.ReactHost
import com.facebook.react.ReactNativeApplicationEntryPoint.loadReactNative
import com.facebook.react.ReactNativeHost
import com.facebook.react.ReactPackage
import com.facebook.react.defaults.DefaultReactHost
import com.facebook.react.defaults.DefaultReactHost.getDefaultReactHost
import com.facebook.react.defaults.DefaultReactNativeHost
import com.facebook.react.runtime.hermes.HermesInstance
class HyperSwitchSDK(
private val reactHost: ReactHost, private val reactNativeHost: ReactNativeHost
) {
public fun getReactHost(): ReactHost {
return reactHost
}
public fun getReactNativeHost(): ReactNativeHost {
return reactNativeHost
}
fun presentFragment(activity: Activity) {
presentFragment(activity, emptyMap())
}
fun presentFragment(activity: Activity, props: Map<String, Any>) {
val propsBundle = Bundle().apply {
putString("type", "payment")
putString("from", "rn")
props.forEach { (key, value) ->
when (value) {
is String -> putString(key, value)
is Int -> putInt(key, value)
is Boolean -> putBoolean(key, value)
is Double -> putDouble(key, value)
}
}
}
val hyperSwitchFragment = HyperswitchFragment.Builder().setComponentName("hyperSwitch")
.setLaunchOptions(propsBundle).build()
val fragmentManager: FragmentManager = (activity as FragmentActivity).supportFragmentManager
val fragmentTransaction: FragmentTransaction = fragmentManager.beginTransaction()
fragmentTransaction.add(android.R.id.content, hyperSwitchFragment, "HyperPaymentSheet")
fragmentTransaction.addToBackStack("HyperPaymentSheet")
fragmentTransaction.commit()
}
companion object {
lateinit var shared: HyperSwitchSDK
private var isInitialized = false
private var isSoLoaderInit = false
private fun initReactNative(application: Application) {
if (!isSoLoaderInit) {
loadReactNative(application)
isSoLoaderInit = true
}
}
fun init(application: Application, reactHost: ReactHost, reactNativeHost: ReactNativeHost) {
if (!isInitialized) {
initReactNative(application)
shared = HyperSwitchSDK(reactHost, reactNativeHost)
isInitialized = true
}
}
/*
Remember to call the InitReactNative before creating the ReactHost and reactNativeHost
*/
fun init(application: Application, packageList: List<ReactPackage>, enableOTA: Boolean) {
initReactNative(application)
val useDeveloperSupport = BuildConfig.DEBUG
val reactHost: ReactHost by lazy {
getDefaultReactHost(
context = application,
packageList =
PackageList(application).packages,
jsMainModulePath = "index",
jsBundleAssetPath = "hyperswitch.bundle",
jsBundleFilePath = "assets://hyperswitch.bundle",
useDevSupport = BuildConfig.DEBUG,
jsRuntimeFactory = HermesInstance()
)
}
val reactNativeHost = object : DefaultReactNativeHost(application) {
override fun getPackages(): List<ReactPackage> = packageList
override fun getJSMainModuleName(): String = "index"
override fun getJSBundleFile(): String? {
return "assets://hyperswitch.bundle"
}
override fun getUseDeveloperSupport(): Boolean = useDeveloperSupport
override val isNewArchEnabled: Boolean = BuildConfig.IS_NEW_ARCHITECTURE_ENABLED
override val isHermesEnabled: Boolean = BuildConfig.IS_HERMES_ENABLED
}
init(application, reactHost, reactNativeHost)
}
fun init(application: Application, enableOTA: Boolean = true) {
init(application, packageList = PackageList(application).packages, enableOTA)
}
fun init(application: Application) {
init(application, enableOTA = true)
}
}
}