@robylon/react-native-sdk 2.0.29-staging.8 → 2.0.31-staging.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/commonjs/Chatbotsdk.js +4 -3
- package/lib/commonjs/Chatbotsdk.js.map +1 -1
- package/lib/commonjs/FloatingButton/launchers/ImageLauncher.js +1 -1
- package/lib/commonjs/FloatingButton/launchers/ImageLauncher.js.map +1 -1
- package/lib/commonjs/FloatingButton/launchers/TextLauncher.js +1 -1
- package/lib/commonjs/FloatingButton/launchers/TextLauncher.js.map +1 -1
- package/lib/commonjs/FloatingButton/launchers/TextualImageLauncher.js +1 -1
- package/lib/commonjs/FloatingButton/launchers/TextualImageLauncher.js.map +1 -1
- package/lib/commonjs/FloatingButton.js +1 -1
- package/lib/commonjs/FloatingButton.js.map +1 -1
- package/lib/commonjs/LoadingIndicator.js +1 -1
- package/lib/commonjs/LoadingIndicator.js.map +1 -1
- package/lib/commonjs/Toast.js +1 -1
- package/lib/commonjs/Toast.js.map +1 -1
- package/lib/commonjs/components/DebugButton.js +1 -1
- package/lib/commonjs/components/DebugButton.js.map +1 -1
- package/lib/commonjs/types/events.js +1 -1
- package/lib/commonjs/types/events.js.map +1 -1
- package/lib/commonjs/utils/fileDownload.js +1 -1
- package/lib/commonjs/utils/fileDownload.js.map +1 -1
- package/lib/commonjs/versions/version.staging.js +1 -1
- package/lib/module/Chatbotsdk.js +4 -3
- package/lib/module/Chatbotsdk.js.map +1 -1
- package/lib/module/FloatingButton/launchers/ImageLauncher.js +1 -1
- package/lib/module/FloatingButton/launchers/ImageLauncher.js.map +1 -1
- package/lib/module/FloatingButton/launchers/TextLauncher.js +1 -1
- package/lib/module/FloatingButton/launchers/TextLauncher.js.map +1 -1
- package/lib/module/FloatingButton/launchers/TextualImageLauncher.js +1 -1
- package/lib/module/FloatingButton/launchers/TextualImageLauncher.js.map +1 -1
- package/lib/module/FloatingButton.js +1 -1
- package/lib/module/FloatingButton.js.map +1 -1
- package/lib/module/LoadingIndicator.js +1 -1
- package/lib/module/LoadingIndicator.js.map +1 -1
- package/lib/module/Toast.js +1 -1
- package/lib/module/Toast.js.map +1 -1
- package/lib/module/components/DebugButton.js +1 -1
- package/lib/module/components/DebugButton.js.map +1 -1
- package/lib/module/openChatbot.js +2 -1
- package/lib/module/openChatbot.js.map +1 -1
- package/lib/module/types/events.js +1 -1
- package/lib/module/types/events.js.map +1 -1
- package/lib/module/utils/fileDownload.js +1 -1
- package/lib/module/utils/fileDownload.js.map +1 -1
- package/lib/module/versions/version.staging.js +1 -1
- package/lib/typescript/Chatbotsdk.d.ts.map +1 -1
- package/lib/typescript/types/events.d.ts +4 -1
- package/lib/typescript/types/events.d.ts.map +1 -1
- package/lib/typescript/utils/fileDownload.d.ts +3 -2
- package/lib/typescript/utils/fileDownload.d.ts.map +1 -1
- package/lib/typescript/versions/version.staging.d.ts +1 -1
- package/package.json +6 -3
- package/src/Chatbotsdk.tsx +33 -14
- package/src/types/events.ts +3 -0
- package/src/utils/fileDownload.ts +116 -14
- package/src/versions/version.staging.ts +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":[
|
|
1
|
+
{"version":3,"names":[],"sourceRoot":"../../src","sources":["openChatbot.tsx"],"mappings":"","ignoreList":[]}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
Object.defineProperty(exports,"__esModule",{value:true});exports.InternalEventType=exports.ChatbotEventType=void 0;var ChatbotEventType=exports.ChatbotEventType=function(ChatbotEventType){ChatbotEventType["CHATBOT_BUTTON_LOADED"]="CHATBOT_BUTTON_LOADED";ChatbotEventType["CHATBOT_BUTTON_CLICKED"]="CHATBOT_BUTTON_CLICKED";ChatbotEventType["CHATBOT_OPENED"]="CHATBOT_OPENED";ChatbotEventType["CHATBOT_CLOSED"]="CHATBOT_CLOSED";ChatbotEventType["CHATBOT_APP_READY"]="CHATBOT_APP_READY";ChatbotEventType["CHATBOT_LOADED"]="CHATBOT_LOADED";ChatbotEventType["CHAT_INITIALIZED"]="CHAT_INITIALIZED";ChatbotEventType["SESSION_REFRESHED"]="SESSION_REFRESHED";ChatbotEventType["CHAT_INITIALIZATION_FAILED"]="CHAT_INITIALIZATION_FAILED";return ChatbotEventType;}({});var InternalEventType=exports.InternalEventType=function(InternalEventType){InternalEventType["CHAT_MOVED"]="CHAT_MOVED";return InternalEventType;}({});
|
|
1
|
+
Object.defineProperty(exports,"__esModule",{value:true});exports.InternalEventType=exports.ChatbotEventType=void 0;var ChatbotEventType=exports.ChatbotEventType=function(ChatbotEventType){ChatbotEventType["CHATBOT_BUTTON_LOADED"]="CHATBOT_BUTTON_LOADED";ChatbotEventType["CHATBOT_BUTTON_CLICKED"]="CHATBOT_BUTTON_CLICKED";ChatbotEventType["CHATBOT_OPENED"]="CHATBOT_OPENED";ChatbotEventType["CHATBOT_CLOSED"]="CHATBOT_CLOSED";ChatbotEventType["CHATBOT_APP_READY"]="CHATBOT_APP_READY";ChatbotEventType["CHATBOT_LOADED"]="CHATBOT_LOADED";ChatbotEventType["CHAT_INITIALIZED"]="CHAT_INITIALIZED";ChatbotEventType["SESSION_REFRESHED"]="SESSION_REFRESHED";ChatbotEventType["CHAT_INITIALIZATION_FAILED"]="CHAT_INITIALIZATION_FAILED";ChatbotEventType["REQUEST_MIC_PERMISSION"]="REQUEST_MIC_PERMISSION";ChatbotEventType["MIC_PERMISSION_GRANTED"]="MIC_PERMISSION_GRANTED";ChatbotEventType["MIC_PERMISSION_DENIED"]="MIC_PERMISSION_DENIED";return ChatbotEventType;}({});var InternalEventType=exports.InternalEventType=function(InternalEventType){InternalEventType["CHAT_MOVED"]="CHAT_MOVED";return InternalEventType;}({});
|
|
2
2
|
//# sourceMappingURL=events.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["ChatbotEventType","exports","InternalEventType"],"sourceRoot":"../../../src","sources":["types/events.ts"],"mappings":"sHAAY,CAAAA,gBAAgB,CAAAC,OAAA,CAAAD,gBAAA,UAAhBA,gBAAgB,EAAhBA,gBAAgB,kDAAhBA,gBAAgB,oDAAhBA,gBAAgB,oCAAhBA,gBAAgB,oCAAhBA,gBAAgB,0CAAhBA,gBAAgB,oCAAhBA,gBAAgB,wCAAhBA,gBAAgB,0CAAhBA,gBAAgB,
|
|
1
|
+
{"version":3,"names":["ChatbotEventType","exports","InternalEventType"],"sourceRoot":"../../../src","sources":["types/events.ts"],"mappings":"sHAAY,CAAAA,gBAAgB,CAAAC,OAAA,CAAAD,gBAAA,UAAhBA,gBAAgB,EAAhBA,gBAAgB,kDAAhBA,gBAAgB,oDAAhBA,gBAAgB,oCAAhBA,gBAAgB,oCAAhBA,gBAAgB,0CAAhBA,gBAAgB,oCAAhBA,gBAAgB,wCAAhBA,gBAAgB,0CAAhBA,gBAAgB,4DAAhBA,gBAAgB,oDAAhBA,gBAAgB,oDAAhBA,gBAAgB,wDAAhB,CAAAA,gBAAgB,UAehB,CAAAE,iBAAiB,CAAAD,OAAA,CAAAC,iBAAA,UAAjBA,iBAAiB,EAAjBA,iBAAiB,kCAAjB,CAAAA,iBAAiB","ignoreList":[]}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
var _interopRequireDefault=require("@babel/runtime/helpers/interopRequireDefault");Object.defineProperty(exports,"__esModule",{value:true});exports.handleDownloadRequest=exports.downloadFile=void 0;var _asyncToGenerator2=_interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));var _reactNative=require("react-native");var _logger=require("./logger");var downloadFile=exports.downloadFile=function(){var
|
|
1
|
+
var _interopRequireDefault=require("@babel/runtime/helpers/interopRequireDefault");Object.defineProperty(exports,"__esModule",{value:true});exports.handleDownloadRequest=exports.downloadFile=void 0;var _asyncToGenerator2=_interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));var _reactNative=require("react-native");var _reactNativeBlobUtil=_interopRequireDefault(require("react-native-blob-util"));var _logger=require("./logger");var normalizeUrl=function normalizeUrl(url){return url==null?void 0:url.trim();};var sanitizeFileName=function sanitizeFileName(filename){var fallbackName=`chat-transcript-${Date.now()}.pdf`;var trimmedName=filename==null?void 0:filename.trim();if(!trimmedName)return fallbackName;return trimmedName.replace(/[<>:"/\\|?*\x00-\x1F]/g,"_");};var isValidHttpUrl=function isValidHttpUrl(url){return /^https?:\/\//i.test(url);};var openUrlWithFallback=function(){var _ref=(0,_asyncToGenerator2.default)(function*(url){try{yield _reactNative.Linking.openURL(url);return;}catch(primaryError){_logger.logger.warn("Primary URL open failed, trying browser fallback",{url:url,primaryError:primaryError instanceof Error?primaryError==null?void 0:primaryError.message:String(primaryError)});}yield _reactNative.Linking.openURL(`https://docs.google.com/viewer?url=${encodeURIComponent(url)}`);});return function openUrlWithFallback(_x){return _ref.apply(this,arguments);};}();var downloadOnAndroid=function(){var _ref2=(0,_asyncToGenerator2.default)(function*(url,filename){var fs=_reactNativeBlobUtil.default.fs,config=_reactNativeBlobUtil.default.config;var downloadPath=`${fs.dirs.DownloadDir}/${filename}`;yield config({fileCache:true,path:downloadPath,addAndroidDownloads:{useDownloadManager:true,notification:true,title:filename,description:"Downloading transcript",mime:"application/pdf",mediaScannable:true,path:downloadPath}}).fetch("GET",url);});return function downloadOnAndroid(_x2,_x3){return _ref2.apply(this,arguments);};}();var downloadOniOS=function(){var _ref3=(0,_asyncToGenerator2.default)(function*(url,filename){var fs=_reactNativeBlobUtil.default.fs,config=_reactNativeBlobUtil.default.config;var iosPath=`${fs.dirs.DocumentDir}/${filename}`;yield config({fileCache:true,path:iosPath}).fetch("GET",url);yield _reactNative.Share.share({url:`file://${iosPath}`,message:filename,title:filename});});return function downloadOniOS(_x4,_x5){return _ref3.apply(this,arguments);};}();var downloadWithNativeStorage=function(){var _ref4=(0,_asyncToGenerator2.default)(function*(url,filename){var safeName=sanitizeFileName(filename);if(_reactNative.Platform.OS==="android"){yield downloadOnAndroid(url,safeName);return;}yield downloadOniOS(url,safeName);});return function downloadWithNativeStorage(_x6,_x7){return _ref4.apply(this,arguments);};}();var shouldUseInPlaceDownload=function shouldUseInPlaceDownload(downloadRequest){return(downloadRequest==null?void 0:downloadRequest.inPlace)===true;};var downloadFile=exports.downloadFile=function(){var _ref5=(0,_asyncToGenerator2.default)(function*(url,filename,inPlace){try{var normalizedUrl=normalizeUrl(url);_logger.logger.debug("Initiating file download",{url:normalizedUrl,filename:filename});if(!normalizedUrl||typeof normalizedUrl!=="string"){throw new Error("Invalid URL provided for download");}if(!isValidHttpUrl(normalizedUrl)){throw new Error("Download URL must be an http/https URL");}if(inPlace){try{yield downloadWithNativeStorage(normalizedUrl,filename);_logger.logger.debug("File downloaded with native storage flow");}catch(nativeDownloadError){_logger.logger.warn("Native download failed, falling back to URL open",{url:normalizedUrl,nativeDownloadError:nativeDownloadError instanceof Error?nativeDownloadError==null?void 0:nativeDownloadError.message:String(nativeDownloadError)});yield openUrlWithFallback(normalizedUrl);_logger.logger.debug("File download opened with fallback browser flow");}return;}yield openUrlWithFallback(normalizedUrl);_logger.logger.debug("File download opened with legacy URL flow");}catch(error){_logger.logger.error("File download failed",{url:url,filename:filename,error:error instanceof Error?error==null?void 0:error.message:String(error)});throw error;}});return function downloadFile(_x8,_x9,_x10){return _ref5.apply(this,arguments);};}();var handleDownloadRequest=exports.handleDownloadRequest=function(){var _ref6=(0,_asyncToGenerator2.default)(function*(downloadRequest){var url=downloadRequest.url,filename=downloadRequest.filename;if(!url){_logger.logger.error("Download request missing URL");return;}try{yield downloadFile(url,filename,shouldUseInPlaceDownload(downloadRequest));}catch(error){_logger.logger.error("Failed to handle download request",{downloadRequest:downloadRequest,error:error});}});return function handleDownloadRequest(_x11){return _ref6.apply(this,arguments);};}();
|
|
2
2
|
//# sourceMappingURL=fileDownload.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_reactNative","require","_logger","
|
|
1
|
+
{"version":3,"names":["_reactNative","require","_reactNativeBlobUtil","_interopRequireDefault","_logger","normalizeUrl","url","trim","sanitizeFileName","filename","fallbackName","Date","now","trimmedName","replace","isValidHttpUrl","test","openUrlWithFallback","_ref","_asyncToGenerator2","default","Linking","openURL","primaryError","logger","warn","Error","message","String","encodeURIComponent","_x","apply","arguments","downloadOnAndroid","_ref2","fs","ReactNativeBlobUtil","config","downloadPath","dirs","DownloadDir","fileCache","path","addAndroidDownloads","useDownloadManager","notification","title","description","mime","mediaScannable","fetch","_x2","_x3","downloadOniOS","_ref3","iosPath","DocumentDir","Share","share","_x4","_x5","downloadWithNativeStorage","_ref4","safeName","Platform","OS","_x6","_x7","shouldUseInPlaceDownload","downloadRequest","inPlace","downloadFile","exports","_ref5","normalizedUrl","debug","nativeDownloadError","error","_x8","_x9","_x10","handleDownloadRequest","_ref6","_x11"],"sourceRoot":"../../../src","sources":["utils/fileDownload.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
Object.defineProperty(exports,"__esModule",{value:true});exports.SDK_VERSION=void 0;var SDK_VERSION=exports.SDK_VERSION='2.0.
|
|
1
|
+
Object.defineProperty(exports,"__esModule",{value:true});exports.SDK_VERSION=void 0;var SDK_VERSION=exports.SDK_VERSION='2.0.31-staging.0';
|
|
2
2
|
//# sourceMappingURL=version.staging.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Chatbotsdk.d.ts","sourceRoot":"","sources":["../../src/Chatbotsdk.tsx"],"names":[],"mappings":"AAAA,OAAO,KAQN,MAAM,OAAO,CAAC;AAkBf,OAAO,
|
|
1
|
+
{"version":3,"file":"Chatbotsdk.d.ts","sourceRoot":"","sources":["../../src/Chatbotsdk.tsx"],"names":[],"mappings":"AAAA,OAAO,KAQN,MAAM,OAAO,CAAC;AAkBf,OAAO,EAEL,mBAAmB,EAEpB,MAAM,gBAAgB,CAAC;AAsBxB,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAAC;IACjC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE;QACb,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;QACzB,YAAY,CAAC,EAAE,OAAO,CAAC;QACvB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,GAAG,CAAC;KAC7B,CAAC;IACF,OAAO,CAAC,EAAE,mBAAmB,CAAC;IAC9B,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;CACtB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,IAAI,CAAC;IACjB,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,OAAO,EAAE,MAAM,OAAO,CAAC;CACxB;AAED,UAAU,oBAAqB,SAAQ,YAAY;IACjD,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,KAAK,IAAI,CAAC;IACnC,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAWD,oBAAY,oBAAoB;IAC9B,MAAM,WAAW;IACjB,OAAO,YAAY;IACnB,KAAK,UAAU;CAChB;AAED,oBAAY,mBAAmB;IAC7B,KAAK,UAAU;IACf,IAAI,SAAS;CACd;AAED,MAAM,WAAW,yBAAyB;IACxC,QAAQ,EAAE,mBAAmB,CAAC;IAC9B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,oBAAY,YAAY;IACtB,IAAI,SAAS;IACb,KAAK,UAAU;IACf,aAAa,kBAAkB;CAChC;AAED,MAAM,WAAW,aAAa;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qBAAqB,CAAC,EAAE;QACtB,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAC;QAC/B,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,YAAY,CAAC,EAAE,MAAM,CAAC;KACvB,CAAC;IACF,cAAc,CAAC,EAAE,oBAAoB,CAAC;IACtC,oBAAoB,CAAC,EAAE,yBAAyB,CAAC;IACjD,aAAa,EAAE,YAAY,CAAC;IAC5B,mBAAmB,EAAE;QACnB,IAAI,CAAC,EAAE,MAAM,CAAC;KACf,CAAC;IACF,MAAM,EAAE;QACN,kBAAkB,CAAC,EAAE;YACnB,GAAG,EAAE,MAAM,CAAC;SACb,CAAC;KACH,CAAC;IACF,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,QAAA,MAAM,OAAO,yFA6vBZ,CAAC;AA0CF,eAAe,OAAO,CAAC"}
|
|
@@ -7,7 +7,10 @@ export declare enum ChatbotEventType {
|
|
|
7
7
|
CHATBOT_LOADED = "CHATBOT_LOADED",
|
|
8
8
|
CHAT_INITIALIZED = "CHAT_INITIALIZED",
|
|
9
9
|
SESSION_REFRESHED = "SESSION_REFRESHED",
|
|
10
|
-
CHAT_INITIALIZATION_FAILED = "CHAT_INITIALIZATION_FAILED"
|
|
10
|
+
CHAT_INITIALIZATION_FAILED = "CHAT_INITIALIZATION_FAILED",
|
|
11
|
+
REQUEST_MIC_PERMISSION = "REQUEST_MIC_PERMISSION",
|
|
12
|
+
MIC_PERMISSION_GRANTED = "MIC_PERMISSION_GRANTED",
|
|
13
|
+
MIC_PERMISSION_DENIED = "MIC_PERMISSION_DENIED"
|
|
11
14
|
}
|
|
12
15
|
export declare enum InternalEventType {
|
|
13
16
|
CHAT_MOVED = "CHAT_MOVED"
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../../src/types/events.ts"],"names":[],"mappings":"AAAA,oBAAY,gBAAgB;IAC1B,qBAAqB,0BAA0B;IAC/C,sBAAsB,2BAA2B;IACjD,cAAc,mBAAmB;IACjC,cAAc,mBAAmB;IACjC,iBAAiB,sBAAsB;IACvC,cAAc,mBAAmB;IACjC,gBAAgB,qBAAqB;IACrC,iBAAiB,sBAAsB;IACvC,0BAA0B,+BAA+B;
|
|
1
|
+
{"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../../src/types/events.ts"],"names":[],"mappings":"AAAA,oBAAY,gBAAgB;IAC1B,qBAAqB,0BAA0B;IAC/C,sBAAsB,2BAA2B;IACjD,cAAc,mBAAmB;IACjC,cAAc,mBAAmB;IACjC,iBAAiB,sBAAsB;IACvC,cAAc,mBAAmB;IACjC,gBAAgB,qBAAqB;IACrC,iBAAiB,sBAAsB;IACvC,0BAA0B,+BAA+B;IACzD,sBAAsB,2BAA2B;IACjD,sBAAsB,2BAA2B;IACjD,qBAAqB,0BAA0B;CAChD;AAED,oBAAY,iBAAiB;IAC3B,UAAU,eAAe;CAC1B;AAED,MAAM,MAAM,aAAa,GAAG,gBAAgB,GAAG,iBAAiB,CAAC;AAEjE,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,gBAAgB,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,GAAG,CAAC;CACZ;AAED,MAAM,MAAM,mBAAmB,GAAG,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,CAAC"}
|
|
@@ -5,13 +5,14 @@
|
|
|
5
5
|
export interface DownloadRequest {
|
|
6
6
|
url: string;
|
|
7
7
|
filename?: string;
|
|
8
|
+
inPlace?: boolean;
|
|
8
9
|
}
|
|
9
10
|
/**
|
|
10
|
-
* Downloads a file using
|
|
11
|
+
* Downloads a file using native storage when possible
|
|
11
12
|
* @param url - The URL of the file to download
|
|
12
13
|
* @param filename - Optional filename for the download
|
|
13
14
|
*/
|
|
14
|
-
export declare const downloadFile: (url: string, filename?: string) => Promise<void>;
|
|
15
|
+
export declare const downloadFile: (url: string, filename?: string, inPlace?: boolean) => Promise<void>;
|
|
15
16
|
/**
|
|
16
17
|
* Handles download request from WebView post message
|
|
17
18
|
* @param downloadRequest - The download request object
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fileDownload.d.ts","sourceRoot":"","sources":["../../../src/utils/fileDownload.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"fileDownload.d.ts","sourceRoot":"","sources":["../../../src/utils/fileDownload.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAkFD;;;;GAIG;AACH,eAAO,MAAM,YAAY,QAClB,MAAM,aACA,MAAM,YACP,OAAO,KAChB,QAAQ,IAAI,CA0Cd,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,qBAAqB,oBACf,eAAe,KAC/B,QAAQ,IAAI,CAiBd,CAAC"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const SDK_VERSION = "2.0.
|
|
1
|
+
export declare const SDK_VERSION = "2.0.31-staging.0";
|
|
2
2
|
//# sourceMappingURL=version.staging.d.ts.map
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@robylon/react-native-sdk",
|
|
3
|
-
"version": "2.0.
|
|
3
|
+
"version": "2.0.31-staging.0",
|
|
4
4
|
"description": "React Native SDK for Robylon",
|
|
5
5
|
"main": "lib/commonjs/index.js",
|
|
6
6
|
"module": "lib/module/index.js",
|
|
@@ -42,13 +42,13 @@
|
|
|
42
42
|
"babel-plugin-transform-inline-environment-variables": "^0.4.4",
|
|
43
43
|
"env-cmd": "^10.1.0",
|
|
44
44
|
"husky": "^8.0.3",
|
|
45
|
+
"metro-react-native-babel-preset": "^0.76.5",
|
|
45
46
|
"react": "^18.0.0",
|
|
46
47
|
"react-native": "^0.76.5",
|
|
47
48
|
"react-native-builder-bob": "^0.20.0",
|
|
48
49
|
"rimraf": "^6.0.1",
|
|
49
50
|
"semver": "^7.5.4",
|
|
50
|
-
"typescript": "^4.5.2"
|
|
51
|
-
"metro-react-native-babel-preset": "^0.76.5"
|
|
51
|
+
"typescript": "^4.5.2"
|
|
52
52
|
},
|
|
53
53
|
"react-native-builder-bob": {
|
|
54
54
|
"source": "src",
|
|
@@ -82,5 +82,8 @@
|
|
|
82
82
|
"commit-msg": "sh scripts/validate-branch-name.sh",
|
|
83
83
|
"post-checkout": "node scripts/prevent-direct-branch.js"
|
|
84
84
|
}
|
|
85
|
+
},
|
|
86
|
+
"dependencies": {
|
|
87
|
+
"react-native-blob-util": "^0.24.7"
|
|
85
88
|
}
|
|
86
89
|
}
|
package/src/Chatbotsdk.tsx
CHANGED
|
@@ -24,7 +24,11 @@ import FloatingButton from "./FloatingButton";
|
|
|
24
24
|
import { API_URL, BASE_CHATBOT_URL, DEFAULT_LAUNCHER_IMAGE } from "./constants";
|
|
25
25
|
import { getSystemInfo, getBrowserAndOSInfoScript } from "./utils/systemInfo";
|
|
26
26
|
import { useChatbotEvents } from "./hooks/useChatbotEvents";
|
|
27
|
-
import {
|
|
27
|
+
import {
|
|
28
|
+
ChatbotEventType,
|
|
29
|
+
ChatbotEventHandler,
|
|
30
|
+
InternalEventType,
|
|
31
|
+
} from "./types/events";
|
|
28
32
|
import { logger } from "./utils/logger";
|
|
29
33
|
import { enableNetworkDebug, enableWebViewDebug } from "./utils/debugConfig";
|
|
30
34
|
import DebugButton from "./components/DebugButton";
|
|
@@ -83,6 +87,7 @@ interface ChatbotMessage {
|
|
|
83
87
|
level?: string;
|
|
84
88
|
url?: string;
|
|
85
89
|
filename?: string;
|
|
90
|
+
inPlace?: boolean;
|
|
86
91
|
}
|
|
87
92
|
|
|
88
93
|
export enum ChatbotInterfaceType {
|
|
@@ -244,12 +249,11 @@ const Chatbot = forwardRef<ChatbotRef, InternalChatbotProps>(
|
|
|
244
249
|
|
|
245
250
|
// Handle WebView messages
|
|
246
251
|
const handleMessage = useCallback(
|
|
247
|
-
(event: WebViewMessageEvent) => {
|
|
252
|
+
async (event: WebViewMessageEvent) => {
|
|
248
253
|
const { data } = event.nativeEvent;
|
|
249
254
|
|
|
250
255
|
try {
|
|
251
256
|
const parsedData: ChatbotMessage = JSON.parse(data);
|
|
252
|
-
|
|
253
257
|
// Handle storage messages
|
|
254
258
|
if (
|
|
255
259
|
Object.values(StorageMessageType).includes(
|
|
@@ -350,6 +354,7 @@ const Chatbot = forwardRef<ChatbotRef, InternalChatbotProps>(
|
|
|
350
354
|
const downloadData: DownloadRequest = parsedData?.data || {
|
|
351
355
|
url: parsedData?.url,
|
|
352
356
|
filename: parsedData?.filename,
|
|
357
|
+
inPlace: parsedData?.inPlace,
|
|
353
358
|
};
|
|
354
359
|
handleDownloadRequest(downloadData);
|
|
355
360
|
}
|
|
@@ -369,6 +374,26 @@ const Chatbot = forwardRef<ChatbotRef, InternalChatbotProps>(
|
|
|
369
374
|
parsedData?.data
|
|
370
375
|
);
|
|
371
376
|
break;
|
|
377
|
+
case "REQUEST_MIC_PERMISSION":
|
|
378
|
+
const granted = await requestAndroidMicPermission();
|
|
379
|
+
if (webViewRef.current && isWebViewVisible) {
|
|
380
|
+
const messageData = {
|
|
381
|
+
name: "requestMicPermission",
|
|
382
|
+
action: "requestMicPermission",
|
|
383
|
+
type: granted
|
|
384
|
+
? "MIC_PERMISSION_GRANTED"
|
|
385
|
+
: "MIC_PERMISSION_DENIED",
|
|
386
|
+
};
|
|
387
|
+
logger.debug("messageData====>", JSON.stringify(messageData));
|
|
388
|
+
webViewRef.current?.injectJavaScript(`
|
|
389
|
+
window.postMessage(${JSON.stringify(messageData)}, '*');`);
|
|
390
|
+
}
|
|
391
|
+
// if (granted) {
|
|
392
|
+
// emitEvent(ChatbotEventType.MIC_PERMISSION_GRANTED);
|
|
393
|
+
// } else {
|
|
394
|
+
// emitEvent(ChatbotEventType.MIC_PERMISSION_DENIED);
|
|
395
|
+
// }
|
|
396
|
+
break;
|
|
372
397
|
default:
|
|
373
398
|
if (onMessage) onMessage(parsedData ?? {});
|
|
374
399
|
}
|
|
@@ -618,11 +643,10 @@ const Chatbot = forwardRef<ChatbotRef, InternalChatbotProps>(
|
|
|
618
643
|
};
|
|
619
644
|
|
|
620
645
|
const requestAndroidMicPermission = useCallback(async () => {
|
|
621
|
-
Alert.alert(
|
|
622
|
-
"Microphone permission",
|
|
623
|
-
"This app uses your microphone for voice features in the chatbot."
|
|
624
|
-
);
|
|
625
646
|
try {
|
|
647
|
+
if (Platform.OS === "ios") {
|
|
648
|
+
return true;
|
|
649
|
+
}
|
|
626
650
|
// Check if already granted
|
|
627
651
|
const alreadyGranted = await PermissionsAndroid.check(
|
|
628
652
|
PermissionsAndroid.PERMISSIONS.RECORD_AUDIO
|
|
@@ -636,8 +660,7 @@ const Chatbot = forwardRef<ChatbotRef, InternalChatbotProps>(
|
|
|
636
660
|
PermissionsAndroid.PERMISSIONS.RECORD_AUDIO,
|
|
637
661
|
{
|
|
638
662
|
title: "Microphone permission",
|
|
639
|
-
message:
|
|
640
|
-
"This app uses your microphone for voice features in the chatbot.",
|
|
663
|
+
message: "This app uses your microphone for voice features.",
|
|
641
664
|
buttonPositive: "Allow",
|
|
642
665
|
buttonNegative: "Deny",
|
|
643
666
|
}
|
|
@@ -660,11 +683,6 @@ const Chatbot = forwardRef<ChatbotRef, InternalChatbotProps>(
|
|
|
660
683
|
}
|
|
661
684
|
}, []);
|
|
662
685
|
|
|
663
|
-
useEffect(() => {
|
|
664
|
-
// Fire and forget: we just want the OS dialog to show early
|
|
665
|
-
requestAndroidMicPermission();
|
|
666
|
-
}, [requestAndroidMicPermission]);
|
|
667
|
-
|
|
668
686
|
const screenDimensions = getScreenDimensions();
|
|
669
687
|
|
|
670
688
|
useEffect(() => {
|
|
@@ -749,6 +767,7 @@ const Chatbot = forwardRef<ChatbotRef, InternalChatbotProps>(
|
|
|
749
767
|
>
|
|
750
768
|
<ErrorBoundary componentName="ChatbotWebView">
|
|
751
769
|
<WebView
|
|
770
|
+
mediaCapturePermissionGrantType={"grant"}
|
|
752
771
|
webviewDebuggingEnabled={true}
|
|
753
772
|
ref={webViewRef}
|
|
754
773
|
source={{
|
package/src/types/events.ts
CHANGED
|
@@ -8,6 +8,9 @@ export enum ChatbotEventType {
|
|
|
8
8
|
CHAT_INITIALIZED = "CHAT_INITIALIZED",
|
|
9
9
|
SESSION_REFRESHED = "SESSION_REFRESHED",
|
|
10
10
|
CHAT_INITIALIZATION_FAILED = "CHAT_INITIALIZATION_FAILED",
|
|
11
|
+
REQUEST_MIC_PERMISSION = "REQUEST_MIC_PERMISSION",
|
|
12
|
+
MIC_PERMISSION_GRANTED = "MIC_PERMISSION_GRANTED",
|
|
13
|
+
MIC_PERMISSION_DENIED = "MIC_PERMISSION_DENIED",
|
|
11
14
|
}
|
|
12
15
|
|
|
13
16
|
export enum InternalEventType {
|
|
@@ -3,43 +3,145 @@
|
|
|
3
3
|
* Utility functions for handling file downloads
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
-
import { Platform,
|
|
6
|
+
import { Linking, Platform, Share } from "react-native";
|
|
7
|
+
import ReactNativeBlobUtil from "react-native-blob-util";
|
|
7
8
|
import { logger } from "./logger";
|
|
8
9
|
|
|
9
10
|
export interface DownloadRequest {
|
|
10
11
|
url: string;
|
|
11
12
|
filename?: string;
|
|
13
|
+
inPlace?: boolean;
|
|
12
14
|
}
|
|
13
15
|
|
|
16
|
+
const normalizeUrl = (url: string): string => {
|
|
17
|
+
return url?.trim();
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
const sanitizeFileName = (filename?: string): string => {
|
|
21
|
+
const fallbackName = `chat-transcript-${Date.now()}.pdf`;
|
|
22
|
+
const trimmedName = filename?.trim();
|
|
23
|
+
if (!trimmedName) return fallbackName;
|
|
24
|
+
return trimmedName.replace(/[<>:"/\\|?*\x00-\x1F]/g, "_");
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
const isValidHttpUrl = (url: string): boolean => {
|
|
28
|
+
return /^https?:\/\//i.test(url);
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
const openUrlWithFallback = async (url: string): Promise<void> => {
|
|
32
|
+
try {
|
|
33
|
+
await Linking.openURL(url);
|
|
34
|
+
return;
|
|
35
|
+
} catch (primaryError) {
|
|
36
|
+
logger.warn("Primary URL open failed, trying browser fallback", {
|
|
37
|
+
url,
|
|
38
|
+
primaryError:
|
|
39
|
+
primaryError instanceof Error
|
|
40
|
+
? primaryError?.message
|
|
41
|
+
: String(primaryError),
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
await Linking.openURL(`https://docs.google.com/viewer?url=${encodeURIComponent(url)}`);
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
const downloadOnAndroid = async (url: string, filename: string): Promise<void> => {
|
|
49
|
+
const { fs, config } = ReactNativeBlobUtil;
|
|
50
|
+
const downloadPath = `${fs.dirs.DownloadDir}/${filename}`;
|
|
51
|
+
await config({
|
|
52
|
+
fileCache: true,
|
|
53
|
+
path: downloadPath,
|
|
54
|
+
addAndroidDownloads: {
|
|
55
|
+
useDownloadManager: true,
|
|
56
|
+
notification: true,
|
|
57
|
+
title: filename,
|
|
58
|
+
description: "Downloading transcript",
|
|
59
|
+
mime: "application/pdf",
|
|
60
|
+
mediaScannable: true,
|
|
61
|
+
path: downloadPath,
|
|
62
|
+
},
|
|
63
|
+
}).fetch("GET", url);
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
const downloadOniOS = async (url: string, filename: string): Promise<void> => {
|
|
67
|
+
const { fs, config } = ReactNativeBlobUtil;
|
|
68
|
+
const iosPath = `${fs.dirs.DocumentDir}/${filename}`;
|
|
69
|
+
await config({
|
|
70
|
+
fileCache: true,
|
|
71
|
+
path: iosPath,
|
|
72
|
+
}).fetch("GET", url);
|
|
73
|
+
await Share.share({
|
|
74
|
+
url: `file://${iosPath}`,
|
|
75
|
+
message: filename,
|
|
76
|
+
title: filename,
|
|
77
|
+
});
|
|
78
|
+
};
|
|
79
|
+
|
|
80
|
+
const downloadWithNativeStorage = async (
|
|
81
|
+
url: string,
|
|
82
|
+
filename?: string
|
|
83
|
+
): Promise<void> => {
|
|
84
|
+
const safeName = sanitizeFileName(filename);
|
|
85
|
+
if (Platform.OS === "android") {
|
|
86
|
+
await downloadOnAndroid(url, safeName);
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
await downloadOniOS(url, safeName);
|
|
90
|
+
};
|
|
91
|
+
|
|
92
|
+
const shouldUseInPlaceDownload = (downloadRequest?: DownloadRequest): boolean => {
|
|
93
|
+
return downloadRequest?.inPlace === true;
|
|
94
|
+
};
|
|
95
|
+
|
|
14
96
|
/**
|
|
15
|
-
* Downloads a file using
|
|
97
|
+
* Downloads a file using native storage when possible
|
|
16
98
|
* @param url - The URL of the file to download
|
|
17
99
|
* @param filename - Optional filename for the download
|
|
18
100
|
*/
|
|
19
101
|
export const downloadFile = async (
|
|
20
102
|
url: string,
|
|
21
|
-
filename?: string
|
|
103
|
+
filename?: string,
|
|
104
|
+
inPlace?: boolean
|
|
22
105
|
): Promise<void> => {
|
|
23
106
|
try {
|
|
24
|
-
|
|
107
|
+
const normalizedUrl = normalizeUrl(url);
|
|
108
|
+
logger.debug("Initiating file download", { url: normalizedUrl, filename });
|
|
25
109
|
|
|
26
110
|
// Validate URL
|
|
27
|
-
if (!
|
|
111
|
+
if (!normalizedUrl || typeof normalizedUrl !== "string") {
|
|
28
112
|
throw new Error("Invalid URL provided for download");
|
|
29
113
|
}
|
|
30
114
|
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
115
|
+
if (!isValidHttpUrl(normalizedUrl)) {
|
|
116
|
+
throw new Error("Download URL must be an http/https URL");
|
|
117
|
+
}
|
|
34
118
|
|
|
35
|
-
if (
|
|
36
|
-
|
|
119
|
+
if (inPlace) {
|
|
120
|
+
try {
|
|
121
|
+
await downloadWithNativeStorage(normalizedUrl, filename);
|
|
122
|
+
logger.debug("File downloaded with native storage flow");
|
|
123
|
+
} catch (nativeDownloadError) {
|
|
124
|
+
logger.warn("Native download failed, falling back to URL open", {
|
|
125
|
+
url: normalizedUrl,
|
|
126
|
+
nativeDownloadError:
|
|
127
|
+
nativeDownloadError instanceof Error
|
|
128
|
+
? nativeDownloadError?.message
|
|
129
|
+
: String(nativeDownloadError),
|
|
130
|
+
});
|
|
131
|
+
await openUrlWithFallback(normalizedUrl);
|
|
132
|
+
logger.debug("File download opened with fallback browser flow");
|
|
133
|
+
}
|
|
134
|
+
return;
|
|
37
135
|
}
|
|
38
136
|
|
|
39
|
-
await
|
|
40
|
-
logger.debug("File download
|
|
137
|
+
await openUrlWithFallback(normalizedUrl);
|
|
138
|
+
logger.debug("File download opened with legacy URL flow");
|
|
41
139
|
} catch (error) {
|
|
42
|
-
logger.error("File download failed", {
|
|
140
|
+
logger.error("File download failed", {
|
|
141
|
+
url,
|
|
142
|
+
filename,
|
|
143
|
+
error: error instanceof Error ? error?.message : String(error),
|
|
144
|
+
});
|
|
43
145
|
throw error;
|
|
44
146
|
}
|
|
45
147
|
};
|
|
@@ -59,7 +161,7 @@ export const handleDownloadRequest = async (
|
|
|
59
161
|
}
|
|
60
162
|
|
|
61
163
|
try {
|
|
62
|
-
await downloadFile(url, filename);
|
|
164
|
+
await downloadFile(url, filename, shouldUseInPlaceDownload(downloadRequest));
|
|
63
165
|
} catch (error) {
|
|
64
166
|
logger.error("Failed to handle download request", {
|
|
65
167
|
downloadRequest,
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
// This file is auto-generated. Do not modify it manually.
|
|
2
|
-
export const SDK_VERSION = '2.0.
|
|
2
|
+
export const SDK_VERSION = '2.0.31-staging.0';
|