@robylon/react-native-sdk 2.2.1-staging.1 → 2.2.1

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.
Files changed (52) hide show
  1. package/README.md +57 -0
  2. package/lib/commonjs/config.js +1 -1
  3. package/lib/commonjs/config.js.map +1 -1
  4. package/lib/commonjs/constants.js +1 -1
  5. package/lib/commonjs/constants.js.map +1 -1
  6. package/lib/module/config.js +1 -1
  7. package/lib/module/config.js.map +1 -1
  8. package/lib/module/constants.js +1 -1
  9. package/lib/module/constants.js.map +1 -1
  10. package/package.json +1 -1
  11. package/robylon-react-native-sdk-2.2.1-staging.1.tgz +0 -0
  12. package/android/src/main/AndroidManifest.xml +0 -3
  13. package/android/src/main/java/com/robylonreactnativesdk/RobylonDownloadModule.java +0 -83
  14. package/android/src/main/java/com/robylonreactnativesdk/RobylonReactNativeSdkPackage.java +0 -24
  15. package/robylon-react-native-sdk-2.2.1-staging.0.tgz +0 -0
  16. package/src/Chatbotsdk.tsx +0 -1191
  17. package/src/FloatingButton/launchers/ImageLauncher.tsx +0 -75
  18. package/src/FloatingButton/launchers/TextLauncher.tsx +0 -84
  19. package/src/FloatingButton/launchers/TextualImageLauncher.tsx +0 -133
  20. package/src/FloatingButton.tsx +0 -97
  21. package/src/LoadingIndicator.tsx +0 -11
  22. package/src/Toast.tsx +0 -65
  23. package/src/components/DebugButton.tsx +0 -46
  24. package/src/components/ErrorBoundary.tsx +0 -38
  25. package/src/config.ts +0 -4
  26. package/src/constants/errorConstants.ts +0 -21
  27. package/src/constants/fontStyles.ts +0 -3
  28. package/src/constants.ts +0 -5
  29. package/src/global.d.ts +0 -11
  30. package/src/hooks/useChatbotEvents.ts +0 -117
  31. package/src/index.tsx +0 -14
  32. package/src/openChatbot.ts +0 -11
  33. package/src/openChatbot.tsx +0 -0
  34. package/src/services/ErrorTrackingService.ts +0 -217
  35. package/src/types/events.ts +0 -28
  36. package/src/types/react-native-flipper-performance-plugin.d.ts +0 -3
  37. package/src/types/react-native-globals.d.ts +0 -10
  38. package/src/utils/animations.ts +0 -120
  39. package/src/utils/colorUtils.ts +0 -35
  40. package/src/utils/cookieUtils.ts +0 -7
  41. package/src/utils/debugConfig.ts +0 -56
  42. package/src/utils/debugMenu.ts +0 -14
  43. package/src/utils/errorHandler.ts +0 -58
  44. package/src/utils/fileDownload.ts +0 -198
  45. package/src/utils/logger.ts +0 -14
  46. package/src/utils/session.ts +0 -26
  47. package/src/utils/systemInfo.ts +0 -110
  48. package/src/utils/webViewStorage.ts +0 -62
  49. package/src/version.ts +0 -2
  50. package/src/versions/version.dev.ts +0 -2
  51. package/src/versions/version.production.ts +0 -2
  52. package/src/versions/version.staging.ts +0 -2
package/README.md CHANGED
@@ -11,6 +11,7 @@
11
11
  - [Required Props](#required-props)
12
12
  - [Optional Props](#optional-props)
13
13
  - [User Profile Properties](#user-profile-properties)
14
+ - [Loading Screen](#loading-screen)
14
15
  - [External Trigger API](#external-trigger-api)
15
16
  - [Ref-based Imperative API](#ref-based-imperative-api)
16
17
  - [Ref Methods](#ref-methods)
@@ -54,6 +55,7 @@ import {
54
55
  Chatbot, // Main chatbot component
55
56
  ChatbotRef, // Ref interface for imperative control
56
57
  ChatbotProps, // Props interface
58
+ ChatbotLoadingScreen, // Shape of the `loading_screen` prop
57
59
  ChatbotEventType, // Event types enum
58
60
  ChatbotEventHandler, // Event handler type
59
61
  } from "@robylon/react-native-sdk";
@@ -115,6 +117,7 @@ export default App;
115
117
  | `session_id` | string | Session to resume. Read when the chat initializes — see [Session Management](#session-management) |
116
118
  | `session_context` | Record<string, any> | Opaque value echoed back as the second argument to `onSession`. Never read by the SDK |
117
119
  | `discrete` | boolean | Defaults to `false`. When `true`, signals to Robylon that this chatbot should be treated as discrete. Read at initialization |
120
+ | `loading_screen` | ChatbotLoadingScreen | Branding shown while the chat UI boots — see [Loading Screen](#loading-screen) |
118
121
  | `onSession` | (session_id: string, session_context?: Record<string, any>) => void | Called whenever the active session id changes |
119
122
  | `onEvent` | ChatbotEventHandler | Callback for chatbot events |
120
123
  | `onOpen` | () => void | Callback when chatbot opens |
@@ -130,6 +133,60 @@ The `user_profile` object can include:
130
133
  - `mobile`: User's mobile number (optional)
131
134
  - `is_test_user`: Mark user as test user for development/testing purposes (optional)
132
135
 
136
+ ### Loading Screen
137
+
138
+ > **Requires SDK ≥ 2.2.1**
139
+
140
+ The chat UI fetches its own configuration when it boots. Until that call
141
+ returns it has nothing to render a header with, so it shows a skeleton and then
142
+ snaps to your branding — a visible flash every time the chat opens.
143
+
144
+ The SDK already holds that branding: it fetches your configuration before it
145
+ mounts the chat, to decide whether to render a launcher and what it should look
146
+ like. It now passes a few of those fields to the chat UI so the real header can
147
+ paint immediately.
148
+
149
+ **This happens automatically — no props required.** The values come from your
150
+ Robylon dashboard configuration. Use `loading_screen` only when you want to
151
+ override them for a particular integration:
152
+
153
+ ```typescript
154
+ <Chatbot
155
+ api_key="YOUR_API_KEY"
156
+ loading_screen={{
157
+ image: "https://example.com/header-avatar.png",
158
+ bot_name: "Acme Support",
159
+ brand_color: "#5B3DF5",
160
+ powered_by: false,
161
+ sub_text: "Typically replies in a minute",
162
+ }}
163
+ />
164
+ ```
165
+
166
+ | Field | Type | Description |
167
+ | ------------- | ------- | -------------------------------------------------------------------- |
168
+ | `image` | string | Header avatar. Defaults to your header image, then your brand logo |
169
+ | `bot_name` | string | Display name in the header |
170
+ | `brand_color` | string | Colour the header is tinted with |
171
+ | `powered_by` | boolean | Whether the "powered by" footer shows |
172
+ | `sub_text` | string | Sub-text under the header. No dashboard equivalent — prop only |
173
+
174
+ #### Behaviour
175
+
176
+ - **Every field is optional.** Anything you omit falls back to your dashboard
177
+ configuration, field by field. Passing `{ bot_name: "Acme" }` overrides only
178
+ the name; the image, colour and footer still come from your dashboard.
179
+ - **Explicit values always win**, including falsy ones. `powered_by: false`
180
+ overrides a dashboard setting of `true`.
181
+ - **`sub_text` has no dashboard equivalent**, so it appears only when you pass
182
+ it here.
183
+ - **First paint only.** These are sent once, when the chat surface first loads,
184
+ and are not re-sent when the user reopens the chat — by then the chat UI has
185
+ its own configuration. They do not restyle the running chat.
186
+ - **A hint, not a source of truth.** The chat UI reconciles to its own
187
+ configuration once that call lands, so a value that is missing or out of date
188
+ is corrected rather than sticking.
189
+
133
190
  ## External Trigger API
134
191
 
135
192
  The SDK now supports external triggering of the chatbot through both controlled component patterns and imperative ref methods.
@@ -1,2 +1,2 @@
1
- Object.defineProperty(exports,"__esModule",{value:true});exports.config=void 0;var config=exports.config={API_URL:process&&process.env&&process.env.API_URL||"https://stage-api.robylon.ai"||'https://api.robylon.com',DEBUG:(process&&process.env&&process.env.DEBUG||"true")==='true'};
1
+ Object.defineProperty(exports,"__esModule",{value:true});exports.config=void 0;var config=exports.config={API_URL:process&&process.env&&process.env.API_URL||"https://api.robylon.ai"||'https://api.robylon.com',DEBUG:(process&&process.env&&process.env.DEBUG||"false")==='true'};
2
2
  //# sourceMappingURL=config.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["config","exports","API_URL","process","env","process.env","DEBUG"],"sourceRoot":"../../src","sources":["config.ts"],"mappings":"+EAAO,GAAM,CAAAA,MAAM,CAAAC,OAAA,CAAAD,MAAA,CAAG,CACpBE,OAAO,CAAEC,OAAA,EAAAA,OAAA,CAAAC,GAAA,EAAAC,WAAA,CAAAH,OAAA,kCAAuB,yBAAyB,CACzDI,KAAK,CAAE,CAAAH,OAAA,EAAAA,OAAA,CAAAC,GAAA,EAAAC,WAAA,CAAAC,KAAA,YAAsB,MAC/B,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["config","exports","API_URL","process","env","process.env","DEBUG"],"sourceRoot":"../../src","sources":["config.ts"],"mappings":"+EAAO,GAAM,CAAAA,MAAM,CAAAC,OAAA,CAAAD,MAAA,CAAG,CACpBE,OAAO,CAAEC,OAAA,EAAAA,OAAA,CAAAC,GAAA,EAAAC,WAAA,CAAAH,OAAA,4BAAuB,yBAAyB,CACzDI,KAAK,CAAE,CAAAH,OAAA,EAAAA,OAAA,CAAAC,GAAA,EAAAC,WAAA,CAAAC,KAAA,aAAsB,MAC/B,CAAC","ignoreList":[]}
@@ -1,2 +1,2 @@
1
- Object.defineProperty(exports,"__esModule",{value:true});exports.DEFAULT_LAUNCHER_IMAGE=exports.BASE_CHATBOT_URL=exports.API_URL=void 0;var BASE_CHATBOT_DOMAIN=process&&process.env&&process.env.CHATBOT_DOMAIN||"https://staging.d2s3wsqyyond1h.amplifyapp.com"||"";var CHATBOT_PATH=process&&process.env&&process.env.CHATBOT_PATH||"chatbot-plugin"||"";var BASE_CHATBOT_URL=exports.BASE_CHATBOT_URL=`${BASE_CHATBOT_DOMAIN}/${CHATBOT_PATH}`;var API_URL=exports.API_URL=process&&process.env&&process.env.API_URL||"https://stage-api.robylon.ai";var DEFAULT_LAUNCHER_IMAGE=exports.DEFAULT_LAUNCHER_IMAGE=`${BASE_CHATBOT_DOMAIN}/chatbubble.png`;
1
+ Object.defineProperty(exports,"__esModule",{value:true});exports.DEFAULT_LAUNCHER_IMAGE=exports.BASE_CHATBOT_URL=exports.API_URL=void 0;var BASE_CHATBOT_DOMAIN=process&&process.env&&process.env.CHATBOT_DOMAIN||"https://chatbot.robylon.ai"||"";var CHATBOT_PATH=process&&process.env&&process.env.CHATBOT_PATH||"chatbot-plugin"||"";var BASE_CHATBOT_URL=exports.BASE_CHATBOT_URL=`${BASE_CHATBOT_DOMAIN}/${CHATBOT_PATH}`;var API_URL=exports.API_URL=process&&process.env&&process.env.API_URL||"https://api.robylon.ai";var DEFAULT_LAUNCHER_IMAGE=exports.DEFAULT_LAUNCHER_IMAGE=`${BASE_CHATBOT_DOMAIN}/chatbubble.png`;
2
2
  //# sourceMappingURL=constants.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["BASE_CHATBOT_DOMAIN","process","env","process.env","CHATBOT_DOMAIN","CHATBOT_PATH","BASE_CHATBOT_URL","exports","API_URL","DEFAULT_LAUNCHER_IMAGE"],"sourceRoot":"../../src","sources":["constants.ts"],"mappings":"wIAAA,GAAM,CAAAA,mBAAmB,CAAGC,OAAA,EAAAA,OAAA,CAAAC,GAAA,EAAAC,WAAA,CAAAC,cAAA,mDAA8B,EAAE,CAC5D,GAAM,CAAAC,YAAY,CAAGJ,OAAA,EAAAA,OAAA,CAAAC,GAAA,EAAAC,WAAA,CAAAE,YAAA,oBAA4B,EAAE,CAC5C,GAAM,CAAAC,gBAAgB,CAAAC,OAAA,CAAAD,gBAAA,CAAG,GAAGN,mBAAmB,IAAIK,YAAY,EAAE,CACjE,GAAM,CAAAG,OAAO,CAAAD,OAAA,CAAAC,OAAA,CAAAP,OAAA,EAAAA,OAAA,CAAAC,GAAA,EAAAC,WAAA,CAAAK,OAAA,gCAAsB,CACnC,GAAM,CAAAC,sBAAsB,CAAAF,OAAA,CAAAE,sBAAA,CAAG,GAAGT,mBAAmB,iBAAiB","ignoreList":[]}
1
+ {"version":3,"names":["BASE_CHATBOT_DOMAIN","process","env","process.env","CHATBOT_DOMAIN","CHATBOT_PATH","BASE_CHATBOT_URL","exports","API_URL","DEFAULT_LAUNCHER_IMAGE"],"sourceRoot":"../../src","sources":["constants.ts"],"mappings":"wIAAA,GAAM,CAAAA,mBAAmB,CAAGC,OAAA,EAAAA,OAAA,CAAAC,GAAA,EAAAC,WAAA,CAAAC,cAAA,gCAA8B,EAAE,CAC5D,GAAM,CAAAC,YAAY,CAAGJ,OAAA,EAAAA,OAAA,CAAAC,GAAA,EAAAC,WAAA,CAAAE,YAAA,oBAA4B,EAAE,CAC5C,GAAM,CAAAC,gBAAgB,CAAAC,OAAA,CAAAD,gBAAA,CAAG,GAAGN,mBAAmB,IAAIK,YAAY,EAAE,CACjE,GAAM,CAAAG,OAAO,CAAAD,OAAA,CAAAC,OAAA,CAAAP,OAAA,EAAAA,OAAA,CAAAC,GAAA,EAAAC,WAAA,CAAAK,OAAA,0BAAsB,CACnC,GAAM,CAAAC,sBAAsB,CAAAF,OAAA,CAAAE,sBAAA,CAAG,GAAGT,mBAAmB,iBAAiB","ignoreList":[]}
@@ -1,2 +1,2 @@
1
- Object.defineProperty(exports,"__esModule",{value:true});exports.config=void 0;var config=exports.config={API_URL:process&&process.env&&process.env.API_URL||"https://stage-api.robylon.ai"||'https://api.robylon.com',DEBUG:(process&&process.env&&process.env.DEBUG||"true")==='true'};
1
+ Object.defineProperty(exports,"__esModule",{value:true});exports.config=void 0;var config=exports.config={API_URL:process&&process.env&&process.env.API_URL||"https://api.robylon.ai"||'https://api.robylon.com',DEBUG:(process&&process.env&&process.env.DEBUG||"false")==='true'};
2
2
  //# sourceMappingURL=config.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["config","exports","API_URL","process","env","process.env","DEBUG"],"sourceRoot":"../../src","sources":["config.ts"],"mappings":"+EAAO,GAAM,CAAAA,MAAM,CAAAC,OAAA,CAAAD,MAAA,CAAG,CACpBE,OAAO,CAAEC,OAAA,EAAAA,OAAA,CAAAC,GAAA,EAAAC,WAAA,CAAAH,OAAA,kCAAuB,yBAAyB,CACzDI,KAAK,CAAE,CAAAH,OAAA,EAAAA,OAAA,CAAAC,GAAA,EAAAC,WAAA,CAAAC,KAAA,YAAsB,MAC/B,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["config","exports","API_URL","process","env","process.env","DEBUG"],"sourceRoot":"../../src","sources":["config.ts"],"mappings":"+EAAO,GAAM,CAAAA,MAAM,CAAAC,OAAA,CAAAD,MAAA,CAAG,CACpBE,OAAO,CAAEC,OAAA,EAAAA,OAAA,CAAAC,GAAA,EAAAC,WAAA,CAAAH,OAAA,4BAAuB,yBAAyB,CACzDI,KAAK,CAAE,CAAAH,OAAA,EAAAA,OAAA,CAAAC,GAAA,EAAAC,WAAA,CAAAC,KAAA,aAAsB,MAC/B,CAAC","ignoreList":[]}
@@ -1,2 +1,2 @@
1
- Object.defineProperty(exports,"__esModule",{value:true});exports.DEFAULT_LAUNCHER_IMAGE=exports.BASE_CHATBOT_URL=exports.API_URL=void 0;var BASE_CHATBOT_DOMAIN=process&&process.env&&process.env.CHATBOT_DOMAIN||"https://staging.d2s3wsqyyond1h.amplifyapp.com"||"";var CHATBOT_PATH=process&&process.env&&process.env.CHATBOT_PATH||"chatbot-plugin"||"";var BASE_CHATBOT_URL=exports.BASE_CHATBOT_URL=`${BASE_CHATBOT_DOMAIN}/${CHATBOT_PATH}`;var API_URL=exports.API_URL=process&&process.env&&process.env.API_URL||"https://stage-api.robylon.ai";var DEFAULT_LAUNCHER_IMAGE=exports.DEFAULT_LAUNCHER_IMAGE=`${BASE_CHATBOT_DOMAIN}/chatbubble.png`;
1
+ Object.defineProperty(exports,"__esModule",{value:true});exports.DEFAULT_LAUNCHER_IMAGE=exports.BASE_CHATBOT_URL=exports.API_URL=void 0;var BASE_CHATBOT_DOMAIN=process&&process.env&&process.env.CHATBOT_DOMAIN||"https://chatbot.robylon.ai"||"";var CHATBOT_PATH=process&&process.env&&process.env.CHATBOT_PATH||"chatbot-plugin"||"";var BASE_CHATBOT_URL=exports.BASE_CHATBOT_URL=`${BASE_CHATBOT_DOMAIN}/${CHATBOT_PATH}`;var API_URL=exports.API_URL=process&&process.env&&process.env.API_URL||"https://api.robylon.ai";var DEFAULT_LAUNCHER_IMAGE=exports.DEFAULT_LAUNCHER_IMAGE=`${BASE_CHATBOT_DOMAIN}/chatbubble.png`;
2
2
  //# sourceMappingURL=constants.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["BASE_CHATBOT_DOMAIN","process","env","process.env","CHATBOT_DOMAIN","CHATBOT_PATH","BASE_CHATBOT_URL","exports","API_URL","DEFAULT_LAUNCHER_IMAGE"],"sourceRoot":"../../src","sources":["constants.ts"],"mappings":"wIAAA,GAAM,CAAAA,mBAAmB,CAAGC,OAAA,EAAAA,OAAA,CAAAC,GAAA,EAAAC,WAAA,CAAAC,cAAA,mDAA8B,EAAE,CAC5D,GAAM,CAAAC,YAAY,CAAGJ,OAAA,EAAAA,OAAA,CAAAC,GAAA,EAAAC,WAAA,CAAAE,YAAA,oBAA4B,EAAE,CAC5C,GAAM,CAAAC,gBAAgB,CAAAC,OAAA,CAAAD,gBAAA,CAAG,GAAGN,mBAAmB,IAAIK,YAAY,EAAE,CACjE,GAAM,CAAAG,OAAO,CAAAD,OAAA,CAAAC,OAAA,CAAAP,OAAA,EAAAA,OAAA,CAAAC,GAAA,EAAAC,WAAA,CAAAK,OAAA,gCAAsB,CACnC,GAAM,CAAAC,sBAAsB,CAAAF,OAAA,CAAAE,sBAAA,CAAG,GAAGT,mBAAmB,iBAAiB","ignoreList":[]}
1
+ {"version":3,"names":["BASE_CHATBOT_DOMAIN","process","env","process.env","CHATBOT_DOMAIN","CHATBOT_PATH","BASE_CHATBOT_URL","exports","API_URL","DEFAULT_LAUNCHER_IMAGE"],"sourceRoot":"../../src","sources":["constants.ts"],"mappings":"wIAAA,GAAM,CAAAA,mBAAmB,CAAGC,OAAA,EAAAA,OAAA,CAAAC,GAAA,EAAAC,WAAA,CAAAC,cAAA,gCAA8B,EAAE,CAC5D,GAAM,CAAAC,YAAY,CAAGJ,OAAA,EAAAA,OAAA,CAAAC,GAAA,EAAAC,WAAA,CAAAE,YAAA,oBAA4B,EAAE,CAC5C,GAAM,CAAAC,gBAAgB,CAAAC,OAAA,CAAAD,gBAAA,CAAG,GAAGN,mBAAmB,IAAIK,YAAY,EAAE,CACjE,GAAM,CAAAG,OAAO,CAAAD,OAAA,CAAAC,OAAA,CAAAP,OAAA,EAAAA,OAAA,CAAAC,GAAA,EAAAC,WAAA,CAAAK,OAAA,0BAAsB,CACnC,GAAM,CAAAC,sBAAsB,CAAAF,OAAA,CAAAE,sBAAA,CAAG,GAAGT,mBAAmB,iBAAiB","ignoreList":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@robylon/react-native-sdk",
3
- "version": "2.2.1-staging.1",
3
+ "version": "2.2.1",
4
4
  "description": "React Native SDK for Robylon",
5
5
  "main": "lib/commonjs/index.js",
6
6
  "module": "lib/module/index.js",
@@ -1,3 +0,0 @@
1
- <manifest xmlns:android="http://schemas.android.com/apk/res/android"
2
- package="com.robylonreactnativesdk">
3
- </manifest>
@@ -1,83 +0,0 @@
1
- package com.robylonreactnativesdk;
2
-
3
- import android.app.DownloadManager;
4
- import android.content.Context;
5
- import android.net.Uri;
6
- import android.os.Environment;
7
- import android.webkit.MimeTypeMap;
8
-
9
- import androidx.annotation.NonNull;
10
-
11
- import com.facebook.react.bridge.Promise;
12
- import com.facebook.react.bridge.ReactApplicationContext;
13
- import com.facebook.react.bridge.ReactContextBaseJavaModule;
14
- import com.facebook.react.bridge.ReactMethod;
15
-
16
- public class RobylonDownloadModule extends ReactContextBaseJavaModule {
17
- private final ReactApplicationContext reactContext;
18
-
19
- public RobylonDownloadModule(ReactApplicationContext reactContext) {
20
- super(reactContext);
21
- this.reactContext = reactContext;
22
- }
23
-
24
- @NonNull
25
- @Override
26
- public String getName() {
27
- return "RobylonDownloadModule";
28
- }
29
-
30
- @ReactMethod
31
- public void downloadFile(String url, String filename, Promise promise) {
32
- try {
33
- if (url == null || url.trim().isEmpty()) {
34
- promise.reject("INVALID_URL", "Download URL is missing");
35
- return;
36
- }
37
-
38
- String safeName = getSafeFileName(filename, url);
39
- DownloadManager manager = (DownloadManager) reactContext.getSystemService(Context.DOWNLOAD_SERVICE);
40
- if (manager == null) {
41
- promise.reject("DOWNLOAD_SERVICE_UNAVAILABLE", "Download service unavailable");
42
- return;
43
- }
44
-
45
- DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url));
46
- request.setTitle(safeName);
47
- request.setDescription("Downloading transcript");
48
- request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
49
- request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, safeName);
50
- request.setMimeType(getMimeTypeFromName(safeName));
51
- request.setAllowedOverMetered(true);
52
- request.setAllowedOverRoaming(true);
53
-
54
- long downloadId = manager.enqueue(request);
55
- promise.resolve(String.valueOf(downloadId));
56
- } catch (Exception error) {
57
- promise.reject("DOWNLOAD_FAILED", error);
58
- }
59
- }
60
-
61
- private String getSafeFileName(String filename, String url) {
62
- if (filename != null && !filename.trim().isEmpty()) {
63
- return filename.trim().replaceAll("[\\\\/:*?\"<>|]", "_");
64
- }
65
- String fromUrl = Uri.parse(url).getLastPathSegment();
66
- if (fromUrl == null || fromUrl.trim().isEmpty()) {
67
- return "chat-transcript-" + System.currentTimeMillis() + ".txt";
68
- }
69
- return fromUrl.trim().replaceAll("[\\\\/:*?\"<>|]", "_");
70
- }
71
-
72
- private String getMimeTypeFromName(String filename) {
73
- String extension = MimeTypeMap.getFileExtensionFromUrl(filename);
74
- if (extension == null || extension.isEmpty()) {
75
- return "application/octet-stream";
76
- }
77
- String mimeType = MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension.toLowerCase());
78
- if (mimeType == null || mimeType.isEmpty()) {
79
- return "application/octet-stream";
80
- }
81
- return mimeType;
82
- }
83
- }
@@ -1,24 +0,0 @@
1
- package com.robylonreactnativesdk;
2
-
3
- import com.facebook.react.ReactPackage;
4
- import com.facebook.react.bridge.NativeModule;
5
- import com.facebook.react.bridge.ReactApplicationContext;
6
- import com.facebook.react.uimanager.ViewManager;
7
-
8
- import java.util.ArrayList;
9
- import java.util.Collections;
10
- import java.util.List;
11
-
12
- public class RobylonReactNativeSdkPackage implements ReactPackage {
13
- @Override
14
- public List<NativeModule> createNativeModules(ReactApplicationContext reactContext) {
15
- List<NativeModule> modules = new ArrayList<>();
16
- modules.add(new RobylonDownloadModule(reactContext));
17
- return modules;
18
- }
19
-
20
- @Override
21
- public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) {
22
- return Collections.emptyList();
23
- }
24
- }