Skip to content
Open
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
2 changes: 1 addition & 1 deletion loans/android/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -64,5 +64,5 @@ android {

dependencies {
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
implementation 'com.smallcase.loans:sdk:5.1.3'
implementation 'com.smallcase.loans:sdk-sourav-native-dark-theme-cb54bf9:5.1.4-92-release'
}
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,21 @@ class ScLoanFlutterPlugin: FlutterPlugin, MethodCallHandler, ActivityAware {

}

// colorScheme rides the bridge as a primitive string and is mapped back to the native
// enum here. Unknown/absent → null so the SDK keeps its light-default behaviour.
private fun parseColorScheme(value: String?): ScLoanColorScheme? = when (value) {

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Is sdk remotely fetching color values from server or its consuming them from host app?

"dark" -> ScLoanColorScheme.DARK
"light" -> ScLoanColorScheme.LIGHT
"system" -> ScLoanColorScheme.SYSTEM
else -> null
}

private fun buildLoanInfo(call: MethodCall): ScLoanInfo {
val interactionToken: String = call.argument("interactionToken") ?: ""
val colorScheme = parseColorScheme(call.argument("colorScheme"))
return ScLoanInfo(interactionToken, colorScheme)
}

override fun onMethodCall(call: MethodCall, result: MethodChannel.Result) {

val safeResult = ScLoanMethodChannelResult(result, activity)
Expand Down Expand Up @@ -88,11 +103,9 @@ class ScLoanFlutterPlugin: FlutterPlugin, MethodCallHandler, ActivityAware {
)
}
"apply" -> {
val interactionToken: String? = call.argument("interactionToken")

ScLoan.apply(
activity,
ScLoanInfo(interactionToken ?: ""),
buildLoanInfo(call),
listener = object : ScLoanResult {
override fun onFailure(error: ScLoanError) {
safeResult.error(error.code.toString(), error.message, error.toString())
Expand All @@ -106,11 +119,9 @@ class ScLoanFlutterPlugin: FlutterPlugin, MethodCallHandler, ActivityAware {
)
}
"pay" -> {
val interactionToken: String? = call.argument("interactionToken")

ScLoan.pay(
activity,
ScLoanInfo(interactionToken ?: ""),
buildLoanInfo(call),
listener = object : ScLoanResult {
override fun onFailure(error: ScLoanError) {
safeResult.error(error.code.toString(), error.message, error.toString())
Expand All @@ -124,11 +135,9 @@ class ScLoanFlutterPlugin: FlutterPlugin, MethodCallHandler, ActivityAware {
)
}
"withdraw" -> {
val interactionToken: String? = call.argument("interactionToken")

ScLoan.withdraw(
activity,
ScLoanInfo(interactionToken ?: ""),
buildLoanInfo(call),
listener = object : ScLoanResult {
override fun onFailure(error: ScLoanError) {
safeResult.error(error.code.toString(), error.message, error.toString())
Expand All @@ -142,11 +151,9 @@ class ScLoanFlutterPlugin: FlutterPlugin, MethodCallHandler, ActivityAware {
)
}
"service" -> {
val interactionToken: String? = call.argument("interactionToken")

ScLoan.service(
activity,
ScLoanInfo(interactionToken ?: ""),
buildLoanInfo(call),
listener = object : ScLoanResult {
override fun onFailure(error: ScLoanError) {
safeResult.error(error.code.toString(), error.message, error.toString())
Expand All @@ -160,11 +167,9 @@ class ScLoanFlutterPlugin: FlutterPlugin, MethodCallHandler, ActivityAware {
)
}
"triggerInteraction" -> {
val interactionToken: String? = call.argument("interactionToken")

ScLoan.triggerInteraction(
activity,
ScLoanInfo(interactionToken ?: ""),
buildLoanInfo(call),
listener = object : ScLoanResult {
override fun onFailure(error: ScLoanError) {
safeResult.error(error.code.toString(), error.message, error.toString())
Expand Down
89 changes: 51 additions & 38 deletions loans/ios/Classes/ScLoanFlutterPlugin.swift
Original file line number Diff line number Diff line change
Expand Up @@ -57,104 +57,118 @@ public class SwiftScLoanFlutterPlugin: NSObject, FlutterPlugin {
registrar.addMethodCallDelegate(instance, channel: channel)
}

// colorScheme rides the bridge as a primitive string and is mapped back to the native
// enum here. Unknown/absent → token-only initializer so the SDK keeps its light-default.
private func loanInfo(from args: Dictionary<String, Any>) -> ScLoanInfo? {
guard let interactionToken = args["interactionToken"] as? String else { return nil }
if let scheme = args["colorScheme"] as? String {
switch scheme {
case "dark":
return ScLoanInfo(interactionToken: interactionToken, colorScheme: .dark)
case "light":
return ScLoanInfo(interactionToken: interactionToken, colorScheme: .light)
case "system":
return ScLoanInfo(interactionToken: interactionToken, colorScheme: .system)
default:
break
}
}
return ScLoanInfo(interactionToken: interactionToken)
}

public func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) {

guard let args = call.arguments as? Dictionary<String, Any> else { return }

switch (call.method) {

case "setup": do {
guard let gateway = args["gateway"] as? String else {
//SDK setup failure
print("ScLoan setup failed: No gateway name provided")
return
}

var env = SCLoanEnvironment.production

if let hostEnv = args["env"] as? Int {
env = SCLoanEnvironment(rawValue: hostEnv) ?? .production
}

ScLoan.instance.setup(
config: ScLoanConfig(gatewayName: gateway, environment: env)) { success, error in

if let err = error {
result(self.convertErrorToFlutterError(error: err))
} else {
result(self.convertSuccessToJsonString(success: success))
}
}
}

case "apply": do {
guard let interactionToken = args["interactionToken"] as? String else {
//SDK setup failure
guard let info = loanInfo(from: args) else {
print("ScLoan apply failed: No interactionToken provided")
return
}

ScLoan.instance.apply(
presentingController: currentViewController,
loanInfo: ScLoanInfo(interactionToken: interactionToken)) { success, error in
loanInfo: info) { success, error in

if let err = error {
result(self.convertErrorToFlutterError(error: err))
} else {
result(self.convertSuccessToJsonString(success: success))
}
}
}

case "pay": do {
guard let interactionToken = args["interactionToken"] as? String else {
//SDK setup failure
guard let info = loanInfo(from: args) else {
print("ScLoan pay failed: No interactionToken provided")
return
}

ScLoan.instance.pay(
presentingController: currentViewController,
loanInfo: ScLoanInfo(interactionToken: interactionToken)) { success, error in
loanInfo: info) { success, error in

if let err = error {
result(self.convertErrorToFlutterError(error: err))
} else {
result(self.convertSuccessToJsonString(success: success))
}
}
}

case "withdraw": do {
guard let interactionToken = args["interactionToken"] as? String else {
//SDK setup failure
guard let info = loanInfo(from: args) else {
print("ScLoan withdraw failed: No interactionToken provided")
return
}

ScLoan.instance.withdraw(
presentingController: currentViewController,
loanInfo: ScLoanInfo(interactionToken: interactionToken)) { success, error in
loanInfo: info) { success, error in

if let err = error {
result(self.convertErrorToFlutterError(error: err))
} else {
result(self.convertSuccessToJsonString(success: success))
}
}
}

case "service": do {
guard let interactionToken = args["interactionToken"] as? String else {
//SDK setup failure
guard let info = loanInfo(from: args) else {
print("ScLoan service failed: No interactionToken provided")
return
}

ScLoan.instance.service(
presentingController: currentViewController,
loanInfo: ScLoanInfo(interactionToken: interactionToken)) { success, error in
loanInfo: info) { success, error in

if let err = error {
result(self.convertErrorToFlutterError(error: err))
} else {
Expand All @@ -163,24 +177,23 @@ public class SwiftScLoanFlutterPlugin: NSObject, FlutterPlugin {
}
}
case "triggerInteraction": do {
guard let interactionToken = args["interactionToken"] as? String else {
//SDK setup failure
guard let info = loanInfo(from: args) else {
print("ScLoan triggerInteraction failed: No interactionToken provided")
return
}

ScLoan.instance.triggerInteraction(
presentingController: currentViewController,
loanInfo: ScLoanInfo(interactionToken: interactionToken)) { success, error in
loanInfo: info) { success, error in

if let err = error {
result(self.convertErrorToFlutterError(error: err))
} else {
result(self.convertSuccessToJsonString(success: success))
}
}
}

default:
result("Flutter method not implemented on iOS")
}
Expand Down
4 changes: 3 additions & 1 deletion loans/ios/scloans.podspec
Original file line number Diff line number Diff line change
Expand Up @@ -19,5 +19,7 @@ Pod::Spec.new do |s|
s.pod_target_xcconfig = { 'DEFINES_MODULE' => 'YES', 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'i386' }
s.swift_version = '5.0'

s.dependency 'SCLoans', '7.2.0'
# INTERNAL TEST PIN: dark-theme branch build (mirrors the android/build.gradle pin).
# Revert to: s.dependency 'SCLoans', '7.2.0'
s.dependency 'SCLoans-sourav-native-dark-theme-37c97d9', '7.1.2-45-release'
end
31 changes: 15 additions & 16 deletions loans/lib/sc_loan.dart
Original file line number Diff line number Diff line change
Expand Up @@ -22,12 +22,19 @@ class ScLoan {
}
}

static Map<String, dynamic> _loanInfoArgs(ScLoanInfo loanInfo) {
return <String, dynamic>{
"interactionToken": loanInfo.interactionToken,
// TODO: use explicit value mapping, not enum .name (fragile to renames).
if (loanInfo.colorScheme != null)
"colorScheme": loanInfo.colorScheme!.name,
};
}

static Future<ScLoanSuccess> apply(ScLoanInfo loanInfo) async {
try {
String? applyResponse =
await _channel.invokeMethod('apply', <String, dynamic>{
"interactionToken": loanInfo.interactionToken,
});
await _channel.invokeMethod('apply', _loanInfoArgs(loanInfo));
return ScLoanSuccess.fromJson(applyResponse ?? "{}");
} on PlatformException catch (e) {
throw e.toScLoanError;
Expand All @@ -37,9 +44,7 @@ class ScLoan {
static Future<ScLoanSuccess> pay(ScLoanInfo loanInfo) async {
try {
String? payResponse =
await _channel.invokeMethod('pay', <String, dynamic>{
"interactionToken": loanInfo.interactionToken,
});
await _channel.invokeMethod('pay', _loanInfoArgs(loanInfo));
return ScLoanSuccess.fromJson(payResponse ?? "{}");
} on PlatformException catch (e) {
throw e.toScLoanError;
Expand All @@ -49,9 +54,7 @@ class ScLoan {
static Future<ScLoanSuccess> withdraw(ScLoanInfo loanInfo) async {
try {
String? withdrawResponse =
await _channel.invokeMethod('withdraw', <String, dynamic>{
"interactionToken": loanInfo.interactionToken,
});
await _channel.invokeMethod('withdraw', _loanInfoArgs(loanInfo));
return ScLoanSuccess.fromJson(withdrawResponse ?? "{}");
} on PlatformException catch (e) {
throw e.toScLoanError;
Expand All @@ -61,9 +64,7 @@ class ScLoan {
static Future<ScLoanSuccess> service(ScLoanInfo loanInfo) async {
try {
String? serviceResponse =
await _channel.invokeMethod('service', <String, dynamic>{
"interactionToken": loanInfo.interactionToken,
});
await _channel.invokeMethod('service', _loanInfoArgs(loanInfo));
return ScLoanSuccess.fromJson(serviceResponse ?? "{}");
} on PlatformException catch (e) {
throw e.toScLoanError;
Expand All @@ -72,10 +73,8 @@ class ScLoan {

static Future<ScLoanSuccess> triggerInteraction(ScLoanInfo loanInfo) async {
try {
String? triggerInteractionResponse =
await _channel.invokeMethod('triggerInteraction', <String, dynamic>{
"interactionToken": loanInfo.interactionToken,
});
String? triggerInteractionResponse = await _channel.invokeMethod(
'triggerInteraction', _loanInfoArgs(loanInfo));
return ScLoanSuccess.fromJson(triggerInteractionResponse ?? "{}");
} on PlatformException catch (e) {
throw e.toScLoanError;
Expand Down
7 changes: 5 additions & 2 deletions loans/lib/sc_loan_props.dart
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
// ignore: constant_identifier_names
enum ScLoanEnvironment { DEVELOPMENT, PRODUCTION, STAGING }

enum ScLoanColorScheme { dark, light, system }

class ScLoanConfig {
final ScLoanEnvironment environment;
final String gateway;
Expand All @@ -10,6 +12,7 @@ class ScLoanConfig {

class ScLoanInfo {
final String interactionToken;
final ScLoanColorScheme? colorScheme;

const ScLoanInfo(this.interactionToken);
}
const ScLoanInfo(this.interactionToken, {this.colorScheme});
}
Loading