@ion299/sdk-react-native 0.1.0-beta.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 (199) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/ChatPlatformSdk.podspec +20 -0
  3. package/README.md +315 -0
  4. package/android/build.gradle +54 -0
  5. package/android/src/main/AndroidManifest.xml +18 -0
  6. package/android/src/main/java/com/chatplatform/sdk/ChatSdkDownloaderModule.kt +240 -0
  7. package/android/src/main/java/com/chatplatform/sdk/ChatSdkFilePickerModule.kt +165 -0
  8. package/android/src/main/java/com/chatplatform/sdk/ChatSdkPackage.kt +15 -0
  9. package/android/src/main/res/xml/chat_sdk_file_paths.xml +7 -0
  10. package/ios/ChatSdkDownloader.m +10 -0
  11. package/ios/ChatSdkDownloader.swift +141 -0
  12. package/ios/ChatSdkFilePicker.m +9 -0
  13. package/ios/ChatSdkFilePicker.swift +161 -0
  14. package/lib/commonjs/ChatSDK.js +193 -0
  15. package/lib/commonjs/ChatSDK.js.map +1 -0
  16. package/lib/commonjs/api.js +195 -0
  17. package/lib/commonjs/api.js.map +1 -0
  18. package/lib/commonjs/attachmentUtils.js +39 -0
  19. package/lib/commonjs/attachmentUtils.js.map +1 -0
  20. package/lib/commonjs/components/AttachmentGallery.js +367 -0
  21. package/lib/commonjs/components/AttachmentGallery.js.map +1 -0
  22. package/lib/commonjs/components/ChatScreen.js +286 -0
  23. package/lib/commonjs/components/ChatScreen.js.map +1 -0
  24. package/lib/commonjs/components/MessageBubble.js +227 -0
  25. package/lib/commonjs/components/MessageBubble.js.map +1 -0
  26. package/lib/commonjs/components/MessageInput.js +273 -0
  27. package/lib/commonjs/components/MessageInput.js.map +1 -0
  28. package/lib/commonjs/components/SurveyOverlay.js +499 -0
  29. package/lib/commonjs/components/SurveyOverlay.js.map +1 -0
  30. package/lib/commonjs/downloaders/defaultAttachmentDownloader.js +28 -0
  31. package/lib/commonjs/downloaders/defaultAttachmentDownloader.js.map +1 -0
  32. package/lib/commonjs/filePicker.js +25 -0
  33. package/lib/commonjs/filePicker.js.map +1 -0
  34. package/lib/commonjs/index.js +27 -0
  35. package/lib/commonjs/index.js.map +1 -0
  36. package/lib/commonjs/native/NativeChatSdkDownloader.js +28 -0
  37. package/lib/commonjs/native/NativeChatSdkDownloader.js.map +1 -0
  38. package/lib/commonjs/native/NativeChatSdkFilePicker.js +17 -0
  39. package/lib/commonjs/native/NativeChatSdkFilePicker.js.map +1 -0
  40. package/lib/commonjs/package.json +1 -0
  41. package/lib/commonjs/realtime.js +242 -0
  42. package/lib/commonjs/realtime.js.map +1 -0
  43. package/lib/commonjs/safeArea.js +18 -0
  44. package/lib/commonjs/safeArea.js.map +1 -0
  45. package/lib/commonjs/session.js +159 -0
  46. package/lib/commonjs/session.js.map +1 -0
  47. package/lib/commonjs/surveyCache.js +30 -0
  48. package/lib/commonjs/surveyCache.js.map +1 -0
  49. package/lib/commonjs/theme.js +29 -0
  50. package/lib/commonjs/theme.js.map +1 -0
  51. package/lib/commonjs/types.js +2 -0
  52. package/lib/commonjs/types.js.map +1 -0
  53. package/lib/commonjs/useChat.js +145 -0
  54. package/lib/commonjs/useChat.js.map +1 -0
  55. package/lib/module/ChatSDK.js +189 -0
  56. package/lib/module/ChatSDK.js.map +1 -0
  57. package/lib/module/api.js +190 -0
  58. package/lib/module/api.js.map +1 -0
  59. package/lib/module/attachmentUtils.js +33 -0
  60. package/lib/module/attachmentUtils.js.map +1 -0
  61. package/lib/module/components/AttachmentGallery.js +362 -0
  62. package/lib/module/components/AttachmentGallery.js.map +1 -0
  63. package/lib/module/components/ChatScreen.js +281 -0
  64. package/lib/module/components/ChatScreen.js.map +1 -0
  65. package/lib/module/components/MessageBubble.js +222 -0
  66. package/lib/module/components/MessageBubble.js.map +1 -0
  67. package/lib/module/components/MessageInput.js +268 -0
  68. package/lib/module/components/MessageInput.js.map +1 -0
  69. package/lib/module/components/SurveyOverlay.js +494 -0
  70. package/lib/module/components/SurveyOverlay.js.map +1 -0
  71. package/lib/module/downloaders/defaultAttachmentDownloader.js +22 -0
  72. package/lib/module/downloaders/defaultAttachmentDownloader.js.map +1 -0
  73. package/lib/module/filePicker.js +20 -0
  74. package/lib/module/filePicker.js.map +1 -0
  75. package/lib/module/index.js +6 -0
  76. package/lib/module/index.js.map +1 -0
  77. package/lib/module/native/NativeChatSdkDownloader.js +23 -0
  78. package/lib/module/native/NativeChatSdkDownloader.js.map +1 -0
  79. package/lib/module/native/NativeChatSdkFilePicker.js +13 -0
  80. package/lib/module/native/NativeChatSdkFilePicker.js.map +1 -0
  81. package/lib/module/package.json +1 -0
  82. package/lib/module/realtime.js +236 -0
  83. package/lib/module/realtime.js.map +1 -0
  84. package/lib/module/safeArea.js +14 -0
  85. package/lib/module/safeArea.js.map +1 -0
  86. package/lib/module/session.js +154 -0
  87. package/lib/module/session.js.map +1 -0
  88. package/lib/module/surveyCache.js +23 -0
  89. package/lib/module/surveyCache.js.map +1 -0
  90. package/lib/module/theme.js +25 -0
  91. package/lib/module/theme.js.map +1 -0
  92. package/lib/module/types.js +2 -0
  93. package/lib/module/types.js.map +1 -0
  94. package/lib/module/useChat.js +141 -0
  95. package/lib/module/useChat.js.map +1 -0
  96. package/lib/typescript/commonjs/ChatSDK.d.ts +49 -0
  97. package/lib/typescript/commonjs/ChatSDK.d.ts.map +1 -0
  98. package/lib/typescript/commonjs/api.d.ts +31 -0
  99. package/lib/typescript/commonjs/api.d.ts.map +1 -0
  100. package/lib/typescript/commonjs/attachmentUtils.d.ts +12 -0
  101. package/lib/typescript/commonjs/attachmentUtils.d.ts.map +1 -0
  102. package/lib/typescript/commonjs/components/AttachmentGallery.d.ts +16 -0
  103. package/lib/typescript/commonjs/components/AttachmentGallery.d.ts.map +1 -0
  104. package/lib/typescript/commonjs/components/ChatScreen.d.ts +16 -0
  105. package/lib/typescript/commonjs/components/ChatScreen.d.ts.map +1 -0
  106. package/lib/typescript/commonjs/components/MessageBubble.d.ts +12 -0
  107. package/lib/typescript/commonjs/components/MessageBubble.d.ts.map +1 -0
  108. package/lib/typescript/commonjs/components/MessageInput.d.ts +14 -0
  109. package/lib/typescript/commonjs/components/MessageInput.d.ts.map +1 -0
  110. package/lib/typescript/commonjs/components/SurveyOverlay.d.ts +13 -0
  111. package/lib/typescript/commonjs/components/SurveyOverlay.d.ts.map +1 -0
  112. package/lib/typescript/commonjs/downloaders/defaultAttachmentDownloader.d.ts +3 -0
  113. package/lib/typescript/commonjs/downloaders/defaultAttachmentDownloader.d.ts.map +1 -0
  114. package/lib/typescript/commonjs/filePicker.d.ts +4 -0
  115. package/lib/typescript/commonjs/filePicker.d.ts.map +1 -0
  116. package/lib/typescript/commonjs/index.d.ts +7 -0
  117. package/lib/typescript/commonjs/index.d.ts.map +1 -0
  118. package/lib/typescript/commonjs/native/NativeChatSdkDownloader.d.ts +24 -0
  119. package/lib/typescript/commonjs/native/NativeChatSdkDownloader.d.ts.map +1 -0
  120. package/lib/typescript/commonjs/native/NativeChatSdkFilePicker.d.ts +17 -0
  121. package/lib/typescript/commonjs/native/NativeChatSdkFilePicker.d.ts.map +1 -0
  122. package/lib/typescript/commonjs/package.json +1 -0
  123. package/lib/typescript/commonjs/realtime.d.ts +42 -0
  124. package/lib/typescript/commonjs/realtime.d.ts.map +1 -0
  125. package/lib/typescript/commonjs/safeArea.d.ts +4 -0
  126. package/lib/typescript/commonjs/safeArea.d.ts.map +1 -0
  127. package/lib/typescript/commonjs/session.d.ts +45 -0
  128. package/lib/typescript/commonjs/session.d.ts.map +1 -0
  129. package/lib/typescript/commonjs/surveyCache.d.ts +5 -0
  130. package/lib/typescript/commonjs/surveyCache.d.ts.map +1 -0
  131. package/lib/typescript/commonjs/theme.d.ts +21 -0
  132. package/lib/typescript/commonjs/theme.d.ts.map +1 -0
  133. package/lib/typescript/commonjs/types.d.ts +156 -0
  134. package/lib/typescript/commonjs/types.d.ts.map +1 -0
  135. package/lib/typescript/commonjs/useChat.d.ts +16 -0
  136. package/lib/typescript/commonjs/useChat.d.ts.map +1 -0
  137. package/lib/typescript/module/ChatSDK.d.ts +49 -0
  138. package/lib/typescript/module/ChatSDK.d.ts.map +1 -0
  139. package/lib/typescript/module/api.d.ts +31 -0
  140. package/lib/typescript/module/api.d.ts.map +1 -0
  141. package/lib/typescript/module/attachmentUtils.d.ts +12 -0
  142. package/lib/typescript/module/attachmentUtils.d.ts.map +1 -0
  143. package/lib/typescript/module/components/AttachmentGallery.d.ts +16 -0
  144. package/lib/typescript/module/components/AttachmentGallery.d.ts.map +1 -0
  145. package/lib/typescript/module/components/ChatScreen.d.ts +16 -0
  146. package/lib/typescript/module/components/ChatScreen.d.ts.map +1 -0
  147. package/lib/typescript/module/components/MessageBubble.d.ts +12 -0
  148. package/lib/typescript/module/components/MessageBubble.d.ts.map +1 -0
  149. package/lib/typescript/module/components/MessageInput.d.ts +14 -0
  150. package/lib/typescript/module/components/MessageInput.d.ts.map +1 -0
  151. package/lib/typescript/module/components/SurveyOverlay.d.ts +13 -0
  152. package/lib/typescript/module/components/SurveyOverlay.d.ts.map +1 -0
  153. package/lib/typescript/module/downloaders/defaultAttachmentDownloader.d.ts +3 -0
  154. package/lib/typescript/module/downloaders/defaultAttachmentDownloader.d.ts.map +1 -0
  155. package/lib/typescript/module/filePicker.d.ts +4 -0
  156. package/lib/typescript/module/filePicker.d.ts.map +1 -0
  157. package/lib/typescript/module/index.d.ts +7 -0
  158. package/lib/typescript/module/index.d.ts.map +1 -0
  159. package/lib/typescript/module/native/NativeChatSdkDownloader.d.ts +24 -0
  160. package/lib/typescript/module/native/NativeChatSdkDownloader.d.ts.map +1 -0
  161. package/lib/typescript/module/native/NativeChatSdkFilePicker.d.ts +17 -0
  162. package/lib/typescript/module/native/NativeChatSdkFilePicker.d.ts.map +1 -0
  163. package/lib/typescript/module/package.json +1 -0
  164. package/lib/typescript/module/realtime.d.ts +42 -0
  165. package/lib/typescript/module/realtime.d.ts.map +1 -0
  166. package/lib/typescript/module/safeArea.d.ts +4 -0
  167. package/lib/typescript/module/safeArea.d.ts.map +1 -0
  168. package/lib/typescript/module/session.d.ts +45 -0
  169. package/lib/typescript/module/session.d.ts.map +1 -0
  170. package/lib/typescript/module/surveyCache.d.ts +5 -0
  171. package/lib/typescript/module/surveyCache.d.ts.map +1 -0
  172. package/lib/typescript/module/theme.d.ts +21 -0
  173. package/lib/typescript/module/theme.d.ts.map +1 -0
  174. package/lib/typescript/module/types.d.ts +156 -0
  175. package/lib/typescript/module/types.d.ts.map +1 -0
  176. package/lib/typescript/module/useChat.d.ts +16 -0
  177. package/lib/typescript/module/useChat.d.ts.map +1 -0
  178. package/package.json +75 -0
  179. package/react-native.config.js +10 -0
  180. package/src/ChatSDK.ts +237 -0
  181. package/src/api.ts +228 -0
  182. package/src/attachmentUtils.ts +49 -0
  183. package/src/components/AttachmentGallery.tsx +363 -0
  184. package/src/components/ChatScreen.tsx +267 -0
  185. package/src/components/MessageBubble.tsx +208 -0
  186. package/src/components/MessageInput.tsx +280 -0
  187. package/src/components/SurveyOverlay.tsx +469 -0
  188. package/src/downloaders/defaultAttachmentDownloader.ts +27 -0
  189. package/src/filePicker.ts +22 -0
  190. package/src/index.ts +30 -0
  191. package/src/native/NativeChatSdkDownloader.ts +49 -0
  192. package/src/native/NativeChatSdkFilePicker.ts +30 -0
  193. package/src/realtime.ts +278 -0
  194. package/src/safeArea.ts +8 -0
  195. package/src/session.ts +196 -0
  196. package/src/surveyCache.ts +24 -0
  197. package/src/theme.ts +49 -0
  198. package/src/types.ts +199 -0
  199. package/src/useChat.ts +190 -0
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+ var _reactNative = require("react-native");
8
+ const MODULE_NAME = 'ChatSdkFilePicker';
9
+ function loadModule() {
10
+ try {
11
+ return _reactNative.TurboModuleRegistry.get(MODULE_NAME);
12
+ } catch {
13
+ return _reactNative.NativeModules[MODULE_NAME] ?? null;
14
+ }
15
+ }
16
+ var _default = exports.default = loadModule();
17
+ //# sourceMappingURL=NativeChatSdkFilePicker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_reactNative","require","MODULE_NAME","loadModule","TurboModuleRegistry","get","NativeModules","_default","exports","default"],"sourceRoot":"..\\..\\..\\src","sources":["native/NativeChatSdkFilePicker.ts"],"mappings":";;;;;;AAAA,IAAAA,YAAA,GAAAC,OAAA;AAmBA,MAAMC,WAAW,GAAG,mBAAmB;AAEvC,SAASC,UAAUA,CAAA,EAAgB;EACjC,IAAI;IACF,OAAOC,gCAAmB,CAACC,GAAG,CAAOH,WAAW,CAAC;EACnD,CAAC,CAAC,MAAM;IACN,OAAQI,0BAAa,CAACJ,WAAW,CAAC,IAAyB,IAAI;EACjE;AACF;AAAC,IAAAK,QAAA,GAAAC,OAAA,CAAAC,OAAA,GAEcN,UAAU,CAAC,CAAC","ignoreList":[]}
@@ -0,0 +1 @@
1
+ {"type":"commonjs"}
@@ -0,0 +1,242 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.RealtimeClient = void 0;
7
+ exports.resolveReverbConfig = resolveReverbConfig;
8
+ /**
9
+ * Минимальный Pusher-протокол поверх нативного WebSocket.
10
+ *
11
+ * Не требует pusher-js / @react-native-community/netinfo.
12
+ * Работает в Expo Go, bare RN, любом JS-окружении с WebSocket.
13
+ *
14
+ * Поддерживает:
15
+ * - presence-channels (подписка с auth)
16
+ * - WidgetMessagesUpdated
17
+ * - heartbeat (pong на pusher:ping)
18
+ * - exponential reconnect
19
+ */
20
+
21
+ const PUSHER_PROTOCOL = 7;
22
+ const RECONNECT_DELAYS = [1000, 2000, 4000, 8000, 16000];
23
+ const MESSAGE_UPDATE_EVENTS = new Set(['ChatSdkMessagesUpdated', '.ChatSdkMessagesUpdated', 'App\\Events\\ChatSdk\\ChatSdkMessagesUpdated']);
24
+
25
+ /** На эмуляторе API часто на 10.0.2.2, а Reverb host с сервера — localhost. */
26
+ function resolveReverbConfig(reverb, apiBaseUrl) {
27
+ const host = reverb.host?.trim() ?? '';
28
+ if (host === 'localhost' || host === '127.0.0.1') {
29
+ try {
30
+ const apiHost = new URL(apiBaseUrl).hostname;
31
+ if (apiHost && apiHost !== 'localhost' && apiHost !== '127.0.0.1') {
32
+ return {
33
+ ...reverb,
34
+ host: apiHost
35
+ };
36
+ }
37
+ } catch {
38
+ // keep original host
39
+ }
40
+ }
41
+ return reverb;
42
+ }
43
+ class RealtimeClient {
44
+ ws = null;
45
+ socketId = null;
46
+ channelName = null;
47
+ handlers = new Map();
48
+ reconnectAttempt = 0;
49
+ reconnectTimer = null;
50
+ destroyed = false;
51
+ authEndpoint = '';
52
+ authHeaders = {};
53
+ wsUrl = '';
54
+
55
+ // ─── Публичное API ─────────────────────────────────────────────────────────
56
+
57
+ connect(config, widgetToken, contactId, authEndpoint, authHeaders, apiBaseUrl) {
58
+ this.destroy();
59
+ this.destroyed = false;
60
+ const resolved = apiBaseUrl ? resolveReverbConfig(config, apiBaseUrl) : config;
61
+ const secure = resolved.scheme === 'https';
62
+ const wsScheme = secure ? 'wss' : 'ws';
63
+ this.wsUrl = `${wsScheme}://${resolved.host}:${resolved.port}/app/${resolved.key}?protocol=${PUSHER_PROTOCOL}&client=js&version=8.4.0`;
64
+ this.channelName = `presence-chat_sdk.${widgetToken}.contact.${contactId}`;
65
+ this.authEndpoint = authEndpoint;
66
+ this.authHeaders = authHeaders;
67
+ this.openSocket();
68
+ }
69
+ disconnect() {
70
+ this.destroy();
71
+ }
72
+ isConnected() {
73
+ return this.ws?.readyState === WebSocket.OPEN && !!this.socketId;
74
+ }
75
+ on(event, handler) {
76
+ if (!this.handlers.has(event)) {
77
+ this.handlers.set(event, new Set());
78
+ }
79
+ this.handlers.get(event).add(handler);
80
+ return () => this.handlers.get(event)?.delete(handler);
81
+ }
82
+
83
+ // ─── Внутренняя логика ─────────────────────────────────────────────────────
84
+
85
+ openSocket() {
86
+ try {
87
+ this.ws = new WebSocket(this.wsUrl);
88
+ } catch (e) {
89
+ this.scheduleReconnect();
90
+ return;
91
+ }
92
+ this.ws.onopen = () => {
93
+ // Pusher пришлёт pusher:connection_established — ждём
94
+ };
95
+ this.ws.onmessage = event => {
96
+ this.handleMessage(String(event.data));
97
+ };
98
+ this.ws.onerror = () => {
99
+ // onclose вызовется следом
100
+ };
101
+ this.ws.onclose = () => {
102
+ this.socketId = null;
103
+ this.emit('disconnected');
104
+ if (!this.destroyed) {
105
+ this.scheduleReconnect();
106
+ }
107
+ };
108
+ }
109
+ handleMessage(raw) {
110
+ let msg;
111
+ try {
112
+ msg = JSON.parse(raw);
113
+ } catch {
114
+ return;
115
+ }
116
+ const eventName = msg.event ?? '';
117
+ switch (eventName) {
118
+ case 'pusher:connection_established':
119
+ {
120
+ const data = typeof msg.data === 'string' ? JSON.parse(msg.data) : msg.data;
121
+ this.socketId = data.socket_id;
122
+ this.reconnectAttempt = 0;
123
+ void this.subscribe();
124
+ break;
125
+ }
126
+ case 'pusher:ping':
127
+ this.send({
128
+ event: 'pusher:pong',
129
+ data: {}
130
+ });
131
+ break;
132
+ case 'pusher:error':
133
+ {
134
+ const errData = this.parseData(msg.data);
135
+ console.warn('ChatSDK realtime: pusher error', errData);
136
+ break;
137
+ }
138
+ case 'pusher_internal:subscription_succeeded':
139
+ this.emit('connected');
140
+ break;
141
+ case 'pusher:subscription_error':
142
+ {
143
+ const errData = this.parseData(msg.data);
144
+ console.warn('ChatSDK realtime: subscription error', errData);
145
+ this.emit('disconnected');
146
+ break;
147
+ }
148
+ default:
149
+ if (MESSAGE_UPDATE_EVENTS.has(eventName)) {
150
+ this.emit('messages_updated', this.parseData(msg.data));
151
+ }
152
+ break;
153
+ }
154
+ }
155
+ async subscribe() {
156
+ if (!this.channelName || !this.socketId) return;
157
+ let auth = '';
158
+ let channelData = '';
159
+ try {
160
+ const res = await fetch(this.authEndpoint, {
161
+ method: 'POST',
162
+ headers: {
163
+ 'Content-Type': 'application/json',
164
+ Accept: 'application/json',
165
+ ...this.authHeaders
166
+ },
167
+ body: JSON.stringify({
168
+ socket_id: this.socketId,
169
+ channel_name: this.channelName
170
+ })
171
+ });
172
+ if (res.ok) {
173
+ const body = await res.json();
174
+ auth = body.auth ?? '';
175
+ channelData = body.channel_data ?? '';
176
+ } else {
177
+ const body = await res.text().catch(() => '');
178
+ console.warn('ChatSDK realtime: auth HTTP', res.status, body);
179
+ }
180
+ } catch (e) {
181
+ console.warn('ChatSDK realtime: auth request failed', e);
182
+ }
183
+ if (!auth) return;
184
+ if (this.ws?.readyState !== WebSocket.OPEN) return;
185
+ const payload = {
186
+ channel: this.channelName,
187
+ auth
188
+ };
189
+ // Presence-канал требует channel_data — без него подписка не проходит
190
+ if (channelData) {
191
+ payload.channel_data = channelData;
192
+ }
193
+ this.send({
194
+ event: 'pusher:subscribe',
195
+ data: payload
196
+ });
197
+ }
198
+ send(payload) {
199
+ if (this.ws?.readyState === WebSocket.OPEN) {
200
+ this.ws.send(JSON.stringify(payload));
201
+ }
202
+ }
203
+ scheduleReconnect() {
204
+ if (this.destroyed) return;
205
+ const delay = RECONNECT_DELAYS[Math.min(this.reconnectAttempt, RECONNECT_DELAYS.length - 1)];
206
+ this.reconnectAttempt++;
207
+ this.reconnectTimer = setTimeout(() => {
208
+ if (!this.destroyed) this.openSocket();
209
+ }, delay);
210
+ }
211
+ destroy() {
212
+ this.destroyed = true;
213
+ if (this.reconnectTimer) {
214
+ clearTimeout(this.reconnectTimer);
215
+ this.reconnectTimer = null;
216
+ }
217
+ if (this.ws) {
218
+ this.ws.onopen = null;
219
+ this.ws.onmessage = null;
220
+ this.ws.onerror = null;
221
+ this.ws.onclose = null;
222
+ this.ws.close();
223
+ this.ws = null;
224
+ }
225
+ this.socketId = null;
226
+ }
227
+ parseData(data) {
228
+ if (typeof data === 'string') {
229
+ try {
230
+ return JSON.parse(data);
231
+ } catch {
232
+ return data;
233
+ }
234
+ }
235
+ return data;
236
+ }
237
+ emit(event, data) {
238
+ this.handlers.get(event)?.forEach(h => h(data));
239
+ }
240
+ }
241
+ exports.RealtimeClient = RealtimeClient;
242
+ //# sourceMappingURL=realtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["PUSHER_PROTOCOL","RECONNECT_DELAYS","MESSAGE_UPDATE_EVENTS","Set","resolveReverbConfig","reverb","apiBaseUrl","host","trim","apiHost","URL","hostname","RealtimeClient","ws","socketId","channelName","handlers","Map","reconnectAttempt","reconnectTimer","destroyed","authEndpoint","authHeaders","wsUrl","connect","config","widgetToken","contactId","destroy","resolved","secure","scheme","wsScheme","port","key","openSocket","disconnect","isConnected","readyState","WebSocket","OPEN","on","event","handler","has","set","get","add","delete","e","scheduleReconnect","onopen","onmessage","handleMessage","String","data","onerror","onclose","emit","raw","msg","JSON","parse","eventName","socket_id","subscribe","send","errData","parseData","console","warn","auth","channelData","res","fetch","method","headers","Accept","body","stringify","channel_name","ok","json","channel_data","text","catch","status","payload","channel","delay","Math","min","length","setTimeout","clearTimeout","close","forEach","h","exports"],"sourceRoot":"..\\..\\src","sources":["realtime.ts"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.INPUT_BOTTOM_PADDING = void 0;
7
+ exports.getAndroidStatusBarHeight = getAndroidStatusBarHeight;
8
+ var _reactNative = require("react-native");
9
+ /** Верхний отступ под status bar (Android). На iOS используйте SafeAreaView. */
10
+ function getAndroidStatusBarHeight() {
11
+ return _reactNative.StatusBar.currentHeight ?? 24;
12
+ }
13
+ const INPUT_BOTTOM_PADDING = exports.INPUT_BOTTOM_PADDING = _reactNative.Platform.select({
14
+ ios: 0,
15
+ android: 12,
16
+ default: 12
17
+ }) ?? 12;
18
+ //# sourceMappingURL=safeArea.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_reactNative","require","getAndroidStatusBarHeight","StatusBar","currentHeight","INPUT_BOTTOM_PADDING","exports","Platform","select","ios","android","default"],"sourceRoot":"..\\..\\src","sources":["safeArea.ts"],"mappings":";;;;;;;AAAA,IAAAA,YAAA,GAAAC,OAAA;AAEA;AACO,SAASC,yBAAyBA,CAAA,EAAW;EAClD,OAAOC,sBAAS,CAACC,aAAa,IAAI,EAAE;AACtC;AAEO,MAAMC,oBAAoB,GAAAC,OAAA,CAAAD,oBAAA,GAAGE,qBAAQ,CAACC,MAAM,CAAC;EAAEC,GAAG,EAAE,CAAC;EAAEC,OAAO,EAAE,EAAE;EAAEC,OAAO,EAAE;AAAG,CAAC,CAAC,IAAI,EAAE","ignoreList":[]}
@@ -0,0 +1,159 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.ChatSDKSession = void 0;
7
+ var _reactNative = require("react-native");
8
+ var _realtime = require("./realtime.js");
9
+ const POLL_INTERVAL_MS = 5000;
10
+ /**
11
+ * Время жизни — от ChatSDK.login() до ChatSDK.logout().
12
+ * Один источник правды для realtime + polling + кэша сообщений/оператора.
13
+ * События проксируются в ChatSDK через emitters.
14
+ */
15
+ class ChatSDKSession {
16
+ realtime = null;
17
+ pollTimer = null;
18
+ appStateSub = null;
19
+ destroyed = false;
20
+ refreshing = false;
21
+ messages = [];
22
+ operator = null;
23
+ knownMessageIds = new Set();
24
+ initialLoaded = false;
25
+ connected = false;
26
+ constructor(api, sdkConfig, widgetToken, baseUrl, emitters) {
27
+ this.api = api;
28
+ this.sdkConfig = sdkConfig;
29
+ this.widgetToken = widgetToken;
30
+ this.baseUrl = baseUrl;
31
+ this.emitters = emitters;
32
+ }
33
+ start() {
34
+ this.openRealtime();
35
+ this.appStateSub = _reactNative.AppState.addEventListener('change', this.handleAppStateChange);
36
+ void this.refreshMessages();
37
+ }
38
+ destroy() {
39
+ this.destroyed = true;
40
+ this.realtime?.disconnect();
41
+ this.realtime = null;
42
+ this.stopPolling();
43
+ this.appStateSub?.remove();
44
+ this.appStateSub = null;
45
+ this.messages = [];
46
+ this.operator = null;
47
+ this.knownMessageIds.clear();
48
+ this.initialLoaded = false;
49
+ if (this.connected) {
50
+ this.connected = false;
51
+ this.emitters.emitConnectedChange(false);
52
+ }
53
+ }
54
+ getMessages() {
55
+ return this.messages;
56
+ }
57
+ getOperator() {
58
+ return this.operator;
59
+ }
60
+ isConnected() {
61
+ return this.connected;
62
+ }
63
+ async refreshMessages() {
64
+ if (this.destroyed || this.refreshing) return;
65
+ this.refreshing = true;
66
+ try {
67
+ const data = await this.api.getMessages();
68
+ if (this.destroyed) return;
69
+ const incoming = data.messages ?? [];
70
+ const nextOperator = data.operator ?? null;
71
+ if (this.initialLoaded) {
72
+ this.detectOperatorChange(nextOperator);
73
+ this.detectNewMessages(incoming, nextOperator);
74
+ }
75
+ this.messages = incoming;
76
+ this.operator = nextOperator;
77
+ this.knownMessageIds = new Set(incoming.map(m => m.id));
78
+ this.initialLoaded = true;
79
+ this.emitters.emitMessagesUpdated(incoming, nextOperator);
80
+ } catch (e) {
81
+ // Тихо — UI-слой (useChat) сам показывает ошибки своих явных действий.
82
+ // Фоновый refresh не должен ронять чат, если на короткое время пропала сеть.
83
+ if (this.initialLoaded) return;
84
+ throw e;
85
+ } finally {
86
+ this.refreshing = false;
87
+ }
88
+ }
89
+ detectOperatorChange(nextOperator) {
90
+ const prevId = this.operator?.id ?? null;
91
+ const nextId = nextOperator?.id ?? null;
92
+ if (prevId === nextId) return;
93
+ const contactId = this.api.getContactId();
94
+ if (!contactId) return;
95
+ this.emitters.emitOperatorChanged({
96
+ token: this.widgetToken,
97
+ contactId,
98
+ previousOperator: this.operator,
99
+ operator: nextOperator,
100
+ occurredAt: new Date().toISOString()
101
+ });
102
+ }
103
+ detectNewMessages(incoming, nextOperator) {
104
+ const contactId = this.api.getContactId();
105
+ if (!contactId) return;
106
+ for (const message of incoming) {
107
+ if (this.knownMessageIds.has(message.id)) continue;
108
+ if (message.type !== 'user') continue;
109
+ this.emitters.emitNewMessage({
110
+ token: this.widgetToken,
111
+ contactId,
112
+ message,
113
+ operator: nextOperator,
114
+ occurredAt: new Date().toISOString()
115
+ });
116
+ }
117
+ }
118
+ openRealtime() {
119
+ const contactId = this.api.getContactId();
120
+ if (!contactId) return;
121
+ const rt = new _realtime.RealtimeClient();
122
+ this.realtime = rt;
123
+ rt.on('connected', () => this.setConnected(true));
124
+ rt.on('disconnected', () => this.setConnected(false));
125
+ rt.on('messages_updated', () => void this.refreshMessages());
126
+ rt.connect(this.sdkConfig.reverb, this.widgetToken, contactId, this.api.getBroadcastAuthEndpoint(), this.api.getAuthHeaders(), this.baseUrl || this.sdkConfig.apiBaseUrl);
127
+ }
128
+ setConnected(value) {
129
+ if (this.connected === value) return;
130
+ this.connected = value;
131
+ this.emitters.emitConnectedChange(value);
132
+ if (value) {
133
+ this.stopPolling();
134
+ } else {
135
+ this.startPolling();
136
+ }
137
+ }
138
+ startPolling() {
139
+ if (this.pollTimer || this.destroyed) return;
140
+ if (_reactNative.AppState.currentState !== 'active') return;
141
+ this.pollTimer = setInterval(() => void this.refreshMessages(), POLL_INTERVAL_MS);
142
+ }
143
+ stopPolling() {
144
+ if (!this.pollTimer) return;
145
+ clearInterval(this.pollTimer);
146
+ this.pollTimer = null;
147
+ }
148
+ handleAppStateChange = next => {
149
+ if (this.destroyed) return;
150
+ if (next === 'active') {
151
+ void this.refreshMessages();
152
+ if (!this.connected) this.startPolling();
153
+ } else {
154
+ this.stopPolling();
155
+ }
156
+ };
157
+ }
158
+ exports.ChatSDKSession = ChatSDKSession;
159
+ //# sourceMappingURL=session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_reactNative","require","_realtime","POLL_INTERVAL_MS","ChatSDKSession","realtime","pollTimer","appStateSub","destroyed","refreshing","messages","operator","knownMessageIds","Set","initialLoaded","connected","constructor","api","sdkConfig","widgetToken","baseUrl","emitters","start","openRealtime","AppState","addEventListener","handleAppStateChange","refreshMessages","destroy","disconnect","stopPolling","remove","clear","emitConnectedChange","getMessages","getOperator","isConnected","data","incoming","nextOperator","detectOperatorChange","detectNewMessages","map","m","id","emitMessagesUpdated","e","prevId","nextId","contactId","getContactId","emitOperatorChanged","token","previousOperator","occurredAt","Date","toISOString","message","has","type","emitNewMessage","rt","RealtimeClient","on","setConnected","connect","reverb","getBroadcastAuthEndpoint","getAuthHeaders","apiBaseUrl","value","startPolling","currentState","setInterval","clearInterval","next","exports"],"sourceRoot":"..\\..\\src","sources":["session.ts"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.clearSurveyCache = clearSurveyCache;
7
+ exports.deleteSurveyEvent = deleteSurveyEvent;
8
+ exports.isSurveyEventSeen = isSurveyEventSeen;
9
+ exports.markSurveyEventSeen = markSurveyEventSeen;
10
+ const cache = new Map();
11
+ function isSurveyEventSeen(contactId, messageId) {
12
+ return cache.get(contactId)?.has(messageId) ?? false;
13
+ }
14
+ function markSurveyEventSeen(contactId, messageId) {
15
+ if (!cache.has(contactId)) {
16
+ cache.set(contactId, new Set());
17
+ }
18
+ cache.get(contactId).add(messageId);
19
+ }
20
+ function deleteSurveyEvent(contactId, messageId) {
21
+ cache.get(contactId)?.delete(messageId);
22
+ }
23
+ function clearSurveyCache(contactId) {
24
+ if (contactId) {
25
+ cache.delete(contactId);
26
+ } else {
27
+ cache.clear();
28
+ }
29
+ }
30
+ //# sourceMappingURL=surveyCache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["cache","Map","isSurveyEventSeen","contactId","messageId","get","has","markSurveyEventSeen","set","Set","add","deleteSurveyEvent","delete","clearSurveyCache","clear"],"sourceRoot":"..\\..\\src","sources":["surveyCache.ts"],"mappings":";;;;;;;;;AAAA,MAAMA,KAAK,GAAG,IAAIC,GAAG,CAAsB,CAAC;AAErC,SAASC,iBAAiBA,CAACC,SAAiB,EAAEC,SAAiB,EAAW;EAC/E,OAAOJ,KAAK,CAACK,GAAG,CAACF,SAAS,CAAC,EAAEG,GAAG,CAACF,SAAS,CAAC,IAAI,KAAK;AACtD;AAEO,SAASG,mBAAmBA,CAACJ,SAAiB,EAAEC,SAAiB,EAAQ;EAC9E,IAAI,CAACJ,KAAK,CAACM,GAAG,CAACH,SAAS,CAAC,EAAE;IACzBH,KAAK,CAACQ,GAAG,CAACL,SAAS,EAAE,IAAIM,GAAG,CAAC,CAAC,CAAC;EACjC;EACAT,KAAK,CAACK,GAAG,CAACF,SAAS,CAAC,CAAEO,GAAG,CAACN,SAAS,CAAC;AACtC;AAEO,SAASO,iBAAiBA,CAACR,SAAiB,EAAEC,SAAiB,EAAQ;EAC5EJ,KAAK,CAACK,GAAG,CAACF,SAAS,CAAC,EAAES,MAAM,CAACR,SAAS,CAAC;AACzC;AAEO,SAASS,gBAAgBA,CAACV,SAAkB,EAAQ;EACzD,IAAIA,SAAS,EAAE;IACbH,KAAK,CAACY,MAAM,CAACT,SAAS,CAAC;EACzB,CAAC,MAAM;IACLH,KAAK,CAACc,KAAK,CAAC,CAAC;EACf;AACF","ignoreList":[]}
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.buildTheme = buildTheme;
7
+ function buildTheme(config) {
8
+ const primary = config?.themeColor ?? '#2d8ef0';
9
+ const isGradient = config?.colorType === 'gradient' && !!config?.colorStart && !!config?.colorEnd;
10
+ return {
11
+ primaryColor: primary,
12
+ primaryColorStart: config?.colorStart ?? null,
13
+ primaryColorEnd: config?.colorEnd ?? null,
14
+ isGradient,
15
+ outboundBg: primary,
16
+ inboundBg: '#f0f0f5',
17
+ outboundText: '#ffffff',
18
+ inboundText: '#1a1a1a',
19
+ background: '#ffffff',
20
+ inputBg: '#f7f7f9',
21
+ inputBorder: '#e0e0e8',
22
+ inputText: '#1a1a1a',
23
+ systemText: '#9999aa',
24
+ headerBg: primary,
25
+ headerText: '#ffffff',
26
+ sendButtonBg: primary
27
+ };
28
+ }
29
+ //# sourceMappingURL=theme.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["buildTheme","config","primary","themeColor","isGradient","colorType","colorStart","colorEnd","primaryColor","primaryColorStart","primaryColorEnd","outboundBg","inboundBg","outboundText","inboundText","background","inputBg","inputBorder","inputText","systemText","headerBg","headerText","sendButtonBg"],"sourceRoot":"..\\..\\src","sources":["theme.ts"],"mappings":";;;;;;AAuBO,SAASA,UAAUA,CAACC,MAA2B,EAAa;EACjE,MAAMC,OAAO,GAAGD,MAAM,EAAEE,UAAU,IAAI,SAAS;EAC/C,MAAMC,UAAU,GACdH,MAAM,EAAEI,SAAS,KAAK,UAAU,IAChC,CAAC,CAACJ,MAAM,EAAEK,UAAU,IACpB,CAAC,CAACL,MAAM,EAAEM,QAAQ;EAEpB,OAAO;IACLC,YAAY,EAAEN,OAAO;IACrBO,iBAAiB,EAAER,MAAM,EAAEK,UAAU,IAAI,IAAI;IAC7CI,eAAe,EAAET,MAAM,EAAEM,QAAQ,IAAI,IAAI;IACzCH,UAAU;IACVO,UAAU,EAAET,OAAO;IACnBU,SAAS,EAAE,SAAS;IACpBC,YAAY,EAAE,SAAS;IACvBC,WAAW,EAAE,SAAS;IACtBC,UAAU,EAAE,SAAS;IACrBC,OAAO,EAAE,SAAS;IAClBC,WAAW,EAAE,SAAS;IACtBC,SAAS,EAAE,SAAS;IACpBC,UAAU,EAAE,SAAS;IACrBC,QAAQ,EAAElB,OAAO;IACjBmB,UAAU,EAAE,SAAS;IACrBC,YAAY,EAAEpB;EAChB,CAAC;AACH","ignoreList":[]}
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":[],"sourceRoot":"..\\..\\src","sources":["types.ts"],"mappings":"","ignoreList":[]}