Skip to content

Commit 37d781a

Browse files
fix(native): correct return types for primitive values in native bridge (#87)
Fixed an issue where native bridge methods with primitive return types (string, boolean, number) always returned as string. Now these methods return the correct JavaScript primitive type. Methods returning objects or arrays were not affected.
1 parent a83002a commit 37d781a

File tree

6 files changed

+58
-31
lines changed

6 files changed

+58
-31
lines changed

android/src/main/java/com/openimsdkrn/BaseImpl.java

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,20 +9,36 @@
99

1010
public class BaseImpl implements Base {
1111
final private Promise promise;
12+
private Class<?> clazz;
1213

1314
private Emitter emitter = new Emitter();
1415

1516
public BaseImpl(Promise promise) {
1617
this.promise = promise;
1718
}
1819

20+
public BaseImpl(Promise promise, Class<?> clazz) {
21+
this.promise = promise;
22+
this.clazz = clazz;
23+
}
24+
1925
@Override
2026
public void onError(int ErrorCode, String ErrorMsg) {
2127
promise.reject(String.valueOf(ErrorCode), ErrorMsg);
2228
}
2329

2430
@Override
2531
public void onSuccess(String s) {
32+
if (clazz == Boolean.class || clazz == Number.class || clazz == String.class) {
33+
promise.resolve(JSON.parseObject(s, clazz));
34+
return;
35+
}
36+
37+
if(s == null) {
38+
promise.resolve(null);
39+
return;
40+
}
41+
2642
try {
2743
promise.resolve(emitter.convertJsonToMap(JSON.parseObject(s)));
2844
} catch (Exception e1) {
@@ -33,5 +49,4 @@ public void onSuccess(String s) {
3349
}
3450
}
3551
}
36-
3752
}

android/src/main/java/com/openimsdkrn/OpenImSdkRnModule.java

Lines changed: 10 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,18 @@
11

22
package com.openimsdkrn;
33

4-
import android.util.Log;
5-
6-
import androidx.annotation.RequiresPermission;
7-
84
import com.facebook.react.bridge.Arguments;
95
import com.facebook.react.bridge.Promise;
106
import com.facebook.react.bridge.ReactApplicationContext;
11-
import com.facebook.react.bridge.ReactContext;
127
import com.facebook.react.bridge.ReactContextBaseJavaModule;
138
import com.facebook.react.bridge.ReactMethod;
14-
import com.alibaba.fastjson.JSONObject;
15-
import com.alibaba.fastjson.JSON;
16-
import com.alibaba.fastjson.JSONException;
179
import com.facebook.react.bridge.ReadableArray;
1810
import com.facebook.react.bridge.ReadableMap;
19-
20-
import com.facebook.react.bridge.WritableArray;
2111
import com.facebook.react.bridge.WritableMap;
12+
13+
import com.alibaba.fastjson.JSONObject;
14+
import com.alibaba.fastjson.JSON;
15+
2216
import com.openimsdkrn.listener.AdvancedMsgListener;
2317
import com.openimsdkrn.listener.InitSDKListener;
2418
import com.openimsdkrn.listener.OnConversationListener;
@@ -28,20 +22,12 @@
2822
import com.openimsdkrn.listener.UserListener;
2923
import com.openimsdkrn.listener.UploadFileCallbackListener;
3024
import com.openimsdkrn.listener.BatchMsgListener;
31-
32-
import com.facebook.react.modules.core.DeviceEventManagerModule;
25+
import com.openimsdkrn.utils.Emitter;
3326

3427
import java.util.ArrayList;
35-
import java.util.Arrays;
3628
import java.util.Objects;
37-
import java.util.UUID;
38-
import java.util.HashMap;
3929

4030
import open_im_sdk.Open_im_sdk;
41-
import open_im_sdk_callback.Base;
42-
import open_im_sdk_callback.UploadLogProgress;
43-
44-
import com.openimsdkrn.utils.Emitter;
4531

4632
public class OpenImSdkRnModule extends ReactContextBaseJavaModule {
4733

@@ -276,7 +262,7 @@ public void setConversationRecvMessageOpt(ReadableMap options, String operationI
276262

277263
@ReactMethod
278264
public void getTotalUnreadMsgCount(String operationID, Promise promise) {
279-
Open_im_sdk.getTotalUnreadMsgCount(new BaseImpl(promise), operationID);
265+
Open_im_sdk.getTotalUnreadMsgCount(new BaseImpl(promise, Number.class), operationID);
280266
}
281267

282268
/**
@@ -809,7 +795,7 @@ public void getFriendApplicationListAsApplicant(ReadableMap req, String operatio
809795

810796
@ReactMethod
811797
public void getFriendApplicationUnhandledCount(ReadableMap req, String operationID, Promise promise) {
812-
Open_im_sdk.getFriendApplicationUnhandledCount(new BaseImpl(promise), operationID, map2string(req));
798+
Open_im_sdk.getFriendApplicationUnhandledCount(new BaseImpl(promise, Number.class), operationID, map2string(req));
813799
}
814800

815801
@ReactMethod
@@ -996,7 +982,7 @@ public void getGroupApplicationListAsApplicant(ReadableMap req, String operation
996982

997983
@ReactMethod
998984
public void getGroupApplicationUnhandledCount(ReadableMap req, String operationID, Promise promise) {
999-
Open_im_sdk.getGroupApplicationUnhandledCount(new BaseImpl(promise), operationID, map2string(req));
985+
Open_im_sdk.getGroupApplicationUnhandledCount(new BaseImpl(promise, Number.class), operationID, map2string(req));
1000986
}
1001987

1002988
@ReactMethod
@@ -1027,7 +1013,7 @@ public void searchGroupMembers(ReadableMap searchOptions, String operationID, Pr
10271013

10281014
@ReactMethod
10291015
public void isJoinGroup(String groupID, String operationID, Promise promise) {
1030-
Open_im_sdk.isJoinGroup(new BaseImpl(promise), operationID, groupID);
1016+
Open_im_sdk.isJoinGroup(new BaseImpl(promise, Boolean.class), operationID, groupID);
10311017
}
10321018

10331019
@ReactMethod
@@ -1115,7 +1101,7 @@ public void logs(ReadableMap options, String operationID, Promise promise) {
11151101

11161102
/**
11171103
* WARN: This method is useless and will be removed in the future.
1118-
*
1104+
*
11191105
* This method should be an async method with Promise parameter, otherwise it is incompatible with React Native 0.80+ versions.
11201106
* Details: https://github.com/openimsdk/open-im-sdk-reactnative/issues/72
11211107
* Note: React Native 0.82+ dropped support for the old architecture.

android/src/main/java/com/openimsdkrn/utils/Emitter.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
import com.alibaba.fastjson.JSONObject;
88
import com.facebook.react.bridge.Arguments;
99
import com.facebook.react.bridge.ReactContext;
10-
import com.facebook.react.bridge.ReadableMap;
1110
import com.facebook.react.bridge.WritableArray;
1211
import com.facebook.react.bridge.WritableMap;
1312

@@ -16,7 +15,6 @@
1615

1716
import java.math.BigDecimal;
1817

19-
2018
public class Emitter {
2119
public void send(ReactContext reactContext, String eventName, @Nullable Object params) {
2220
reactContext

ios/CallbackProxy.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,12 @@
1111

1212
NS_ASSUME_NONNULL_BEGIN
1313

14+
typedef _Nullable id (^RNOIMSuccessCallback)(NSString * _Nullable data);
15+
1416
@interface RNCallbackProxy : NSObject <Open_im_sdk_callbackBase>
1517

1618
- (id)initWithCallback:(RCTPromiseResolveBlock)resolver rejecter:(RCTPromiseRejectBlock)rejecter;
19+
- (id)initWithCallback:(RCTPromiseResolveBlock)resolver rejecter:(RCTPromiseRejectBlock)rejecter onSuccess:(RNOIMSuccessCallback _Nullable)onSuccess;
1720

1821
@end
1922

ios/CallbackProxy.m

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,21 @@ @interface RNCallbackProxy()
44

55
@property (nonatomic, copy) RCTPromiseResolveBlock resolver;
66
@property (nonatomic, copy) RCTPromiseRejectBlock rejecter;
7+
@property (nonatomic, copy, nullable) RNOIMSuccessCallback _onSuccess;
78

89
@end
910

1011
@implementation RNCallbackProxy
1112

1213
- (id)initWithCallback:(RCTPromiseResolveBlock)resolver rejecter:(RCTPromiseRejectBlock)rejecter {
14+
return [self initWithCallback:resolver rejecter:rejecter onSuccess:nil];
15+
}
16+
17+
- (id)initWithCallback:(RCTPromiseResolveBlock)resolver rejecter:(RCTPromiseRejectBlock)rejecter onSuccess:(RNOIMSuccessCallback _Nullable)onSuccess {
1318
if (self = [super init]) {
1419
self.resolver = resolver;
1520
self.rejecter = rejecter;
21+
self._onSuccess = onSuccess;
1622
}
1723
return self;
1824
}
@@ -44,6 +50,17 @@ - (void)onError:(int32_t)errCode errMsg:(NSString * _Nullable)errMsg {
4450
}
4551

4652
- (void)onSuccess:(NSString * _Nullable)data {
53+
if (self._onSuccess) {
54+
id result = self._onSuccess(data);
55+
self.resolver(result);
56+
return;
57+
}
58+
59+
if (!data) {
60+
self.resolver(nil);
61+
return;
62+
}
63+
4764
NSDictionary *dataDict = [self parseJsonStr2Dict:data];
4865
if (dataDict) {
4966
self.resolver(dataDict);

ios/OpenImSdkRn.m

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -350,7 +350,9 @@ - (NSArray *)parseJsonStr2Array:(NSString *)jsonStr {
350350
}
351351

352352
RCT_EXPORT_METHOD(getTotalUnreadMsgCount:(NSString *)operationID resolver:(RCTPromiseResolveBlock)resolver rejecter:(RCTPromiseRejectBlock)rejecter) {
353-
RNCallbackProxy *proxy = [[RNCallbackProxy alloc] initWithCallback:resolver rejecter:rejecter];
353+
RNCallbackProxy *proxy = [[RNCallbackProxy alloc] initWithCallback:resolver rejecter:rejecter onSuccess:^id _Nullable(NSString * _Nullable data) {
354+
return data ? @([data intValue]) : nil;
355+
}];
354356
Open_im_sdkGetTotalUnreadMsgCount(proxy, operationID);
355357
}
356358

@@ -911,7 +913,9 @@ - (NSArray *)parseJsonStr2Array:(NSString *)jsonStr {
911913
}
912914

913915
RCT_EXPORT_METHOD(getFriendApplicationUnhandledCount:(NSDictionary *)req operationID:(NSString *)operationID resolver:(RCTPromiseResolveBlock)resolver rejecter:(RCTPromiseRejectBlock)rejecter) {
914-
RNCallbackProxy *proxy = [[RNCallbackProxy alloc] initWithCallback:resolver rejecter:rejecter];
916+
RNCallbackProxy *proxy = [[RNCallbackProxy alloc] initWithCallback:resolver rejecter:rejecter onSuccess:^id _Nullable(NSString * _Nullable data) {
917+
return data ? @([data intValue]) : nil;
918+
}];
915919
Open_im_sdkGetFriendApplicationUnhandledCount(proxy, operationID, [req json]);
916920
}
917921

@@ -1162,7 +1166,9 @@ - (NSArray *)parseJsonStr2Array:(NSString *)jsonStr {
11621166
}
11631167

11641168
RCT_EXPORT_METHOD(getGroupApplicationUnhandledCount:(NSDictionary *)req operationID:(NSString *)operationID resolver:(RCTPromiseResolveBlock)resolver rejecter:(RCTPromiseRejectBlock)rejecter) {
1165-
RNCallbackProxy *proxy = [[RNCallbackProxy alloc] initWithCallback:resolver rejecter:rejecter];
1169+
RNCallbackProxy *proxy = [[RNCallbackProxy alloc] initWithCallback:resolver rejecter:rejecter onSuccess:^id _Nullable(NSString * _Nullable data) {
1170+
return data ? @([data intValue]) : nil;
1171+
}];
11661172
Open_im_sdkGetGroupApplicationUnhandledCount(proxy, operationID, [req json]);
11671173
}
11681174

@@ -1203,7 +1209,9 @@ - (NSArray *)parseJsonStr2Array:(NSString *)jsonStr {
12031209
}
12041210

12051211
RCT_EXPORT_METHOD(isJoinGroup:(NSString *)groupID operationID:(NSString *)operationID resolver:(RCTPromiseResolveBlock)resolver rejecter:(RCTPromiseRejectBlock)rejecter) {
1206-
RNCallbackProxy *proxy = [[RNCallbackProxy alloc] initWithCallback:resolver rejecter:rejecter];
1212+
RNCallbackProxy *proxy = [[RNCallbackProxy alloc] initWithCallback:resolver rejecter:rejecter onSuccess:^id _Nullable(NSString * _Nullable data) {
1213+
return data ? @([data boolValue]) : nil;
1214+
}];
12071215
Open_im_sdkIsJoinGroup(proxy, operationID, groupID);
12081216
}
12091217

0 commit comments

Comments
 (0)