diff --git a/README.md b/README.md index 365ecbc..c9bec54 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -[![SupportedLanguages](https://img.shields.io/badge/Platforms-iOS%20%7C%20%20Android-green.svg)](https://www.zoho.com/salesiq/help/developer-section/react-native-sdk-installation.html) [![Version](https://img.shields.io/badge/version-9.2.1-blue.svg)](https://mobilisten.io/) [![Mobilisten NPM CD](https://github.com/zoho/SalesIQ-Mobilisten-ReactNative/workflows/Mobilisten%20NPM%20CD/badge.svg)](https://github.com/zoho/SalesIQ-Mobilisten-ReactNative/actions) +[![SupportedLanguages](https://img.shields.io/badge/Platforms-iOS%20%7C%20%20Android-green.svg)](https://www.zoho.com/salesiq/help/developer-section/react-native-sdk-installation.html) [![Version](https://img.shields.io/badge/version-9.3.0-blue.svg)](https://mobilisten.io/) [![Mobilisten NPM CD](https://github.com/zoho/SalesIQ-Mobilisten-ReactNative/workflows/Mobilisten%20NPM%20CD/badge.svg)](https://github.com/zoho/SalesIQ-Mobilisten-ReactNative/actions) # React Native module for SalesIQ Mobilisten SDK diff --git a/android/build.gradle b/android/build.gradle index 4d156e1..82c4779 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -45,5 +45,5 @@ repositories { dependencies { implementation 'com.facebook.react:react-native:+' implementation 'com.squareup.retrofit2:converter-gson:2.9.0' - api 'com.zoho.salesiq:mobilisten:8.0.1' + api 'com.zoho.salesiq:mobilisten:8.0.2' } diff --git a/android/src/main/java/com/zohosalesiq/reactlibrary/RNZohoSalesIQ.java b/android/src/main/java/com/zohosalesiq/reactlibrary/RNZohoSalesIQ.java index e011956..a867839 100644 --- a/android/src/main/java/com/zohosalesiq/reactlibrary/RNZohoSalesIQ.java +++ b/android/src/main/java/com/zohosalesiq/reactlibrary/RNZohoSalesIQ.java @@ -62,6 +62,7 @@ import com.zoho.livechat.android.modules.common.DataModule; import com.zoho.livechat.android.modules.common.ui.LauncherUtil; import com.zoho.livechat.android.modules.common.ui.lifecycle.SalesIQActivitiesManager; +import com.zoho.livechat.android.modules.common.ui.result.entities.SalesIQError; import com.zoho.livechat.android.modules.knowledgebase.ui.entities.Resource; import com.zoho.livechat.android.modules.knowledgebase.ui.entities.ResourceCategory; import com.zoho.livechat.android.modules.knowledgebase.ui.entities.ResourceDepartment; @@ -592,7 +593,7 @@ public static void showLauncher(final String mode) { @ReactMethod public static void updateListener(final String listener) { - + } @ReactMethod @@ -1168,6 +1169,35 @@ public void onInitError() { } } + @ReactMethod + void present(final String tabString, final String id, final Callback callback) { + HANDLER.post(() -> { + ZohoSalesIQ.Tab tab = getTab(tabString); + ZohoSalesIQ.present(tab, id, result -> { + if (callback != null) { + if (result.isSuccess()) { + callback.invoke(null, result.getData()); + } else { + SalesIQError error = result.getError(); + callback.invoke(getErrorMap(error.getCode(), error.getMessage()), null); + } + } + }); + }); + } + + private static ZohoSalesIQ.Tab getTab(String tab) { + ZohoSalesIQ.Tab tabType = null; + if (tab != null) { + if (Tab.CONVERSATIONS.name.equals(tab)) { + tabType = ZohoSalesIQ.Tab.Conversations; + } else if (Tab.KNOWLEDGE_BASE.name.equals(tab) || Tab.FAQ.name.equals(tab)) { + tabType = ZohoSalesIQ.Tab.KnowledgeBase; + } + } + return tabType; + } + public static void eventEmitter(String event, Object value) { if (reactContext != null && hasAnyEventListeners) { LiveChatUtil.log("eventEmitter, Send event: " + event); @@ -1735,6 +1765,63 @@ static void showFeedbackUpToDuration(final int duration) { ZohoSalesIQ.Chat.showFeedback(duration); } + @ReactMethod + static void startNewChat(final String question, final String customChatId, final String departmentName, final Callback callback) { + final Callback[] finalCallback = {callback}; + ZohoSalesIQ.Chat.start(question, customChatId, departmentName, result -> { + if (finalCallback[0] != null) { + if (result.isSuccess()) { + VisitorChat visitorChat = result.getData(); + WritableMap visitorMap = getChatMapObject(visitorChat); + finalCallback[0].invoke(null, visitorMap); + } else { + SalesIQError error = result.getError(); + finalCallback[0].invoke(getErrorMap(error.getCode(), error.getMessage()), null); + } + } + finalCallback[0] = null; + }); + } + + @ReactMethod + static void startNewChatWithTrigger(final String customChatId, final String departmentName, final Callback callback) { + final Callback[] finalCallback = {callback}; + ZohoSalesIQ.Chat.startWithTrigger(customChatId, departmentName, result -> { + if (finalCallback[0] != null) { + if (result.isSuccess()) { + VisitorChat visitorChat = result.getData(); + WritableMap visitorMap = getChatMapObject(visitorChat); + finalCallback[0].invoke(null, visitorMap); + } else { + SalesIQError error = result.getError(); + finalCallback[0].invoke(getErrorMap(error.getCode(), error.getMessage()), null); + } + } + finalCallback[0] = null; + }); + } + + @ReactMethod + static void getChat(final String chatId, final Callback callback) { + ZohoSalesIQ.Chat.get(chatId, result -> { + if (callback != null) { + if (result.isSuccess()) { + VisitorChat visitorChat = result.getData(); + WritableMap visitorMap = getChatMapObject(visitorChat); + callback.invoke(null, visitorMap); + } else { + SalesIQError error = result.getError(); + callback.invoke(getErrorMap(error.getCode(), error.getMessage()), null); + } + } + }); + } + + @ReactMethod + static void setChatWaitingTime(final int seconds) { + ZohoSalesIQ.Chat.setWaitingTime(seconds); + } + public static final String RESOURCE_ARTICLES = "RESOURCE_ARTICLES"; // No I18N private @Nullable ZohoSalesIQ.ResourceType getResourceType(String value) { @@ -1927,7 +2014,7 @@ static String convertToCamelCase(String input) { return camelCase.toString(); } - WritableMap getErrorMap(int code, String message) { + static WritableMap getErrorMap(int code, String message) { WritableMap errorMap = new WritableNativeMap(); errorMap.putInt("code", code); // No I18N errorMap.putString("message", message); // No I18N diff --git a/components/zohosalesiqJSWrapper.js b/components/zohosalesiqJSWrapper.js index 6dfdb7d..81c569d 100644 --- a/components/zohosalesiqJSWrapper.js +++ b/components/zohosalesiqJSWrapper.js @@ -88,6 +88,9 @@ module.exports = { initWithCallback: function (appKey, accessKey, callback) { RNZohoSalesIQ.initWithCallback(appKey, accessKey, callback); }, + present: function(tab = null, id = null, callback = ()=>{}) { + RNZohoSalesIQ.present(tab, id, callback); + }, setChatTitle: function (title) { RNZohoSalesIQ.setChatTitle(title); }, @@ -148,6 +151,7 @@ module.exports = { setQuestion: function (question) { RNZohoSalesIQ.setQuestion(question); }, + // DEPRECATED startChat: function (message) { RNZohoSalesIQ.startChat(message); }, @@ -293,6 +297,18 @@ module.exports = { }, open: function (map) { RNZohoSalesIQ.showPayloadChat(map); + }, + start: function(question, customChatId = null, departmentName = null, callback = ()=>{}) { + RNZohoSalesIQ.startNewChat(question, customChatId, departmentName, callback); + }, + startWithTrigger: function(customChatId = null, departmentName = null, callback = ()=>{}) { + RNZohoSalesIQ.startNewChatWithTrigger(customChatId, departmentName, callback); + }, + setWaitingTime: function(seconds) { + RNZohoSalesIQ.setChatWaitingTime(seconds); + }, + get: function(chatId, callback) { + RNZohoSalesIQ.getChat(chatId, callback); } }, sendEvent: function (eventName, ...values) { diff --git a/ios/RNZohoSalesIQ.m b/ios/RNZohoSalesIQ.m index 05853f2..d383c96 100644 --- a/ios/RNZohoSalesIQ.m +++ b/ios/RNZohoSalesIQ.m @@ -1314,6 +1314,77 @@ + (void)handleNotificationAction: (NSDictionary *) info response:(NSString *) re [[ZohoSalesIQ Chat] showWithReferenceID:nil new:YES]; } +//MARK:- START CHAT API's +RCT_EXPORT_METHOD(startNewChat: (NSString *)question chatId:(NSString * _Nullable)chatId department:(NSString * _Nullable)department callback:(RCTResponseSenderBlock)callback){ + [[ZohoSalesIQ Chat] startWithQuestion:question chatID:chatId department:department completion:^(id<SIQError> _Nullable error, SIQVisitorChat * _Nullable chat) { + if (callback) { + if(error != nil){ + NSMutableDictionary *errorDictionary = [RNZohoSalesIQ getSIQErrorObject:error]; + callback(@[errorDictionary, [NSNull null]]); + }else{ + NSMutableDictionary *chatDict = [NSMutableDictionary dictionary]; + chatDict = [RNZohoSalesIQ getChatObject:chat]; + callback(@[[NSNull null], chatDict]); + } + } + }]; +} + +RCT_EXPORT_METHOD(startNewChatWithTrigger: (NSString * _Nullable)chatId department:(NSString * _Nullable)department callback:(RCTResponseSenderBlock)callback){ + [[ZohoSalesIQ Chat] startWithTriggerWithChatID:chatId department:department completion:^(id<SIQError> _Nullable error, SIQVisitorChat * _Nullable chat) { + if (callback) { + if(error != nil){ + NSMutableDictionary *errorDictionary = [RNZohoSalesIQ getSIQErrorObject:error]; + callback(@[errorDictionary, [NSNull null]]); + }else{ + NSMutableDictionary *chatDict = [NSMutableDictionary dictionary]; + chatDict = [RNZohoSalesIQ getChatObject:chat]; + callback(@[[NSNull null], chatDict]); + } + } + }]; +} + +RCT_EXPORT_METHOD(getChat: (NSString *)chatId callback:(RCTResponseSenderBlock)callback){ + [[ZohoSalesIQ Chat] getWithChatID:chatId completion:^(id<SIQError> _Nullable error, SIQVisitorChat * _Nullable chat) { + if(error != nil){ + NSMutableDictionary *errorDictionary = [RNZohoSalesIQ getSIQErrorObject:error]; + callback(@[errorDictionary, [NSNull null]]); + }else{ + NSMutableDictionary *chatDict = [NSMutableDictionary dictionary]; + chatDict = [RNZohoSalesIQ getChatObject:chat]; + callback(@[[NSNull null], chatDict]); + } + }]; +} + +RCT_EXPORT_METHOD(present: (NSString * _Nullable)tab referenceId:(NSString * _Nullable)referenceId callback:(RCTResponseSenderBlock)callback) { + NSNumber *tabNumber; + if ([tab isEqual: TAB_CONVERSATIONS]) { + tabNumber = [NSNumber numberWithInteger:0]; + } else if ([tab isEqual:TAB_FAQ] || [tab isEqual:TAB_KNOWLEDGE_BASE]) { + tabNumber = [NSNumber numberWithInteger:1]; + } + + [ZohoSalesIQ presentWithTabBarItem:tabNumber referenceID:referenceId shouldShowListView:YES completion:^(id<SIQError> _Nullable error, BOOL success) { + if (callback) { + NSNumber *complete = [NSNumber numberWithBool:success]; + if(error != nil){ + NSMutableDictionary *errorDictionary = [RNZohoSalesIQ getSIQErrorObject:error]; + callback(@[errorDictionary, @[complete]]); + } else { + callback(@[[NSNull null], @[complete]]); + } + } + }]; +} + + +RCT_EXPORT_METHOD(setChatWaitingTime: (NSInteger)seconds){ + [[ZohoSalesIQ Chat] setWaitingTimeWithUpTo:seconds]; +} + + //MARK:- CHAT END SESSION API RCT_EXPORT_METHOD(endChat: (NSString *)ref_id){ [[ZohoSalesIQ Chat] endSessionWithReferenceID:ref_id]; diff --git a/ios/RNZohoSalesIQ.podspec b/ios/RNZohoSalesIQ.podspec index 695731b..f03141e 100644 --- a/ios/RNZohoSalesIQ.podspec +++ b/ios/RNZohoSalesIQ.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = "RNZohoSalesIQ" - s.version = "9.0.3" + s.version = "9.1.0" s.summary = "A React-Native module for the SalesIQ Mobilisten SDK" s.description = "A React-Native module for the SalesIQ Mobilisten SDK" s.homepage = "https://zoho.com" diff --git a/package.json b/package.json index f3f7331..74f8256 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "react-native-zohosalesiq-mobilisten", - "version": "9.2.1", + "version": "9.3.0", "description": "A React Native module for the ZohoSalesIQ Mobilisten SDK", "bugs": { "email": "support@zohosalesiq.com"