@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,236 @@
1
+ "use strict";
2
+
3
+ /**
4
+ * Минимальный Pusher-протокол поверх нативного WebSocket.
5
+ *
6
+ * Не требует pusher-js / @react-native-community/netinfo.
7
+ * Работает в Expo Go, bare RN, любом JS-окружении с WebSocket.
8
+ *
9
+ * Поддерживает:
10
+ * - presence-channels (подписка с auth)
11
+ * - WidgetMessagesUpdated
12
+ * - heartbeat (pong на pusher:ping)
13
+ * - exponential reconnect
14
+ */
15
+
16
+ const PUSHER_PROTOCOL = 7;
17
+ const RECONNECT_DELAYS = [1000, 2000, 4000, 8000, 16000];
18
+ const MESSAGE_UPDATE_EVENTS = new Set(['ChatSdkMessagesUpdated', '.ChatSdkMessagesUpdated', 'App\\Events\\ChatSdk\\ChatSdkMessagesUpdated']);
19
+
20
+ /** На эмуляторе API часто на 10.0.2.2, а Reverb host с сервера — localhost. */
21
+ export function resolveReverbConfig(reverb, apiBaseUrl) {
22
+ const host = reverb.host?.trim() ?? '';
23
+ if (host === 'localhost' || host === '127.0.0.1') {
24
+ try {
25
+ const apiHost = new URL(apiBaseUrl).hostname;
26
+ if (apiHost && apiHost !== 'localhost' && apiHost !== '127.0.0.1') {
27
+ return {
28
+ ...reverb,
29
+ host: apiHost
30
+ };
31
+ }
32
+ } catch {
33
+ // keep original host
34
+ }
35
+ }
36
+ return reverb;
37
+ }
38
+ export class RealtimeClient {
39
+ ws = null;
40
+ socketId = null;
41
+ channelName = null;
42
+ handlers = new Map();
43
+ reconnectAttempt = 0;
44
+ reconnectTimer = null;
45
+ destroyed = false;
46
+ authEndpoint = '';
47
+ authHeaders = {};
48
+ wsUrl = '';
49
+
50
+ // ─── Публичное API ─────────────────────────────────────────────────────────
51
+
52
+ connect(config, widgetToken, contactId, authEndpoint, authHeaders, apiBaseUrl) {
53
+ this.destroy();
54
+ this.destroyed = false;
55
+ const resolved = apiBaseUrl ? resolveReverbConfig(config, apiBaseUrl) : config;
56
+ const secure = resolved.scheme === 'https';
57
+ const wsScheme = secure ? 'wss' : 'ws';
58
+ this.wsUrl = `${wsScheme}://${resolved.host}:${resolved.port}/app/${resolved.key}?protocol=${PUSHER_PROTOCOL}&client=js&version=8.4.0`;
59
+ this.channelName = `presence-chat_sdk.${widgetToken}.contact.${contactId}`;
60
+ this.authEndpoint = authEndpoint;
61
+ this.authHeaders = authHeaders;
62
+ this.openSocket();
63
+ }
64
+ disconnect() {
65
+ this.destroy();
66
+ }
67
+ isConnected() {
68
+ return this.ws?.readyState === WebSocket.OPEN && !!this.socketId;
69
+ }
70
+ on(event, handler) {
71
+ if (!this.handlers.has(event)) {
72
+ this.handlers.set(event, new Set());
73
+ }
74
+ this.handlers.get(event).add(handler);
75
+ return () => this.handlers.get(event)?.delete(handler);
76
+ }
77
+
78
+ // ─── Внутренняя логика ─────────────────────────────────────────────────────
79
+
80
+ openSocket() {
81
+ try {
82
+ this.ws = new WebSocket(this.wsUrl);
83
+ } catch (e) {
84
+ this.scheduleReconnect();
85
+ return;
86
+ }
87
+ this.ws.onopen = () => {
88
+ // Pusher пришлёт pusher:connection_established — ждём
89
+ };
90
+ this.ws.onmessage = event => {
91
+ this.handleMessage(String(event.data));
92
+ };
93
+ this.ws.onerror = () => {
94
+ // onclose вызовется следом
95
+ };
96
+ this.ws.onclose = () => {
97
+ this.socketId = null;
98
+ this.emit('disconnected');
99
+ if (!this.destroyed) {
100
+ this.scheduleReconnect();
101
+ }
102
+ };
103
+ }
104
+ handleMessage(raw) {
105
+ let msg;
106
+ try {
107
+ msg = JSON.parse(raw);
108
+ } catch {
109
+ return;
110
+ }
111
+ const eventName = msg.event ?? '';
112
+ switch (eventName) {
113
+ case 'pusher:connection_established':
114
+ {
115
+ const data = typeof msg.data === 'string' ? JSON.parse(msg.data) : msg.data;
116
+ this.socketId = data.socket_id;
117
+ this.reconnectAttempt = 0;
118
+ void this.subscribe();
119
+ break;
120
+ }
121
+ case 'pusher:ping':
122
+ this.send({
123
+ event: 'pusher:pong',
124
+ data: {}
125
+ });
126
+ break;
127
+ case 'pusher:error':
128
+ {
129
+ const errData = this.parseData(msg.data);
130
+ console.warn('ChatSDK realtime: pusher error', errData);
131
+ break;
132
+ }
133
+ case 'pusher_internal:subscription_succeeded':
134
+ this.emit('connected');
135
+ break;
136
+ case 'pusher:subscription_error':
137
+ {
138
+ const errData = this.parseData(msg.data);
139
+ console.warn('ChatSDK realtime: subscription error', errData);
140
+ this.emit('disconnected');
141
+ break;
142
+ }
143
+ default:
144
+ if (MESSAGE_UPDATE_EVENTS.has(eventName)) {
145
+ this.emit('messages_updated', this.parseData(msg.data));
146
+ }
147
+ break;
148
+ }
149
+ }
150
+ async subscribe() {
151
+ if (!this.channelName || !this.socketId) return;
152
+ let auth = '';
153
+ let channelData = '';
154
+ try {
155
+ const res = await fetch(this.authEndpoint, {
156
+ method: 'POST',
157
+ headers: {
158
+ 'Content-Type': 'application/json',
159
+ Accept: 'application/json',
160
+ ...this.authHeaders
161
+ },
162
+ body: JSON.stringify({
163
+ socket_id: this.socketId,
164
+ channel_name: this.channelName
165
+ })
166
+ });
167
+ if (res.ok) {
168
+ const body = await res.json();
169
+ auth = body.auth ?? '';
170
+ channelData = body.channel_data ?? '';
171
+ } else {
172
+ const body = await res.text().catch(() => '');
173
+ console.warn('ChatSDK realtime: auth HTTP', res.status, body);
174
+ }
175
+ } catch (e) {
176
+ console.warn('ChatSDK realtime: auth request failed', e);
177
+ }
178
+ if (!auth) return;
179
+ if (this.ws?.readyState !== WebSocket.OPEN) return;
180
+ const payload = {
181
+ channel: this.channelName,
182
+ auth
183
+ };
184
+ // Presence-канал требует channel_data — без него подписка не проходит
185
+ if (channelData) {
186
+ payload.channel_data = channelData;
187
+ }
188
+ this.send({
189
+ event: 'pusher:subscribe',
190
+ data: payload
191
+ });
192
+ }
193
+ send(payload) {
194
+ if (this.ws?.readyState === WebSocket.OPEN) {
195
+ this.ws.send(JSON.stringify(payload));
196
+ }
197
+ }
198
+ scheduleReconnect() {
199
+ if (this.destroyed) return;
200
+ const delay = RECONNECT_DELAYS[Math.min(this.reconnectAttempt, RECONNECT_DELAYS.length - 1)];
201
+ this.reconnectAttempt++;
202
+ this.reconnectTimer = setTimeout(() => {
203
+ if (!this.destroyed) this.openSocket();
204
+ }, delay);
205
+ }
206
+ destroy() {
207
+ this.destroyed = true;
208
+ if (this.reconnectTimer) {
209
+ clearTimeout(this.reconnectTimer);
210
+ this.reconnectTimer = null;
211
+ }
212
+ if (this.ws) {
213
+ this.ws.onopen = null;
214
+ this.ws.onmessage = null;
215
+ this.ws.onerror = null;
216
+ this.ws.onclose = null;
217
+ this.ws.close();
218
+ this.ws = null;
219
+ }
220
+ this.socketId = null;
221
+ }
222
+ parseData(data) {
223
+ if (typeof data === 'string') {
224
+ try {
225
+ return JSON.parse(data);
226
+ } catch {
227
+ return data;
228
+ }
229
+ }
230
+ return data;
231
+ }
232
+ emit(event, data) {
233
+ this.handlers.get(event)?.forEach(h => h(data));
234
+ }
235
+ }
236
+ //# 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"],"sourceRoot":"..\\..\\src","sources":["realtime.ts"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAUA,MAAMA,eAAe,GAAG,CAAC;AACzB,MAAMC,gBAAgB,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC;AAExD,MAAMC,qBAAqB,GAAG,IAAIC,GAAG,CAAC,CACpC,wBAAwB,EACxB,yBAAyB,EACzB,8CAA8C,CAC/C,CAAC;;AAEF;AACA,OAAO,SAASC,mBAAmBA,CACjCC,MAAoB,EACpBC,UAAkB,EACJ;EACd,MAAMC,IAAI,GAAGF,MAAM,CAACE,IAAI,EAAEC,IAAI,CAAC,CAAC,IAAI,EAAE;EACtC,IAAID,IAAI,KAAK,WAAW,IAAIA,IAAI,KAAK,WAAW,EAAE;IAChD,IAAI;MACF,MAAME,OAAO,GAAG,IAAIC,GAAG,CAACJ,UAAU,CAAC,CAACK,QAAQ;MAC5C,IAAIF,OAAO,IAAIA,OAAO,KAAK,WAAW,IAAIA,OAAO,KAAK,WAAW,EAAE;QACjE,OAAO;UAAE,GAAGJ,MAAM;UAAEE,IAAI,EAAEE;QAAQ,CAAC;MACrC;IACF,CAAC,CAAC,MAAM;MACN;IAAA;EAEJ;EACA,OAAOJ,MAAM;AACf;AAEA,OAAO,MAAMO,cAAc,CAAC;EAClBC,EAAE,GAAqB,IAAI;EAC3BC,QAAQ,GAAkB,IAAI;EAC9BC,WAAW,GAAkB,IAAI;EACjCC,QAAQ,GAA6C,IAAIC,GAAG,CAAC,CAAC;EAC9DC,gBAAgB,GAAG,CAAC;EACpBC,cAAc,GAAyC,IAAI;EAC3DC,SAAS,GAAG,KAAK;EAEjBC,YAAY,GAAG,EAAE;EACjBC,WAAW,GAA2B,CAAC,CAAC;EACxCC,KAAK,GAAG,EAAE;;EAElB;;EAEAC,OAAOA,CACLC,MAAoB,EACpBC,WAAmB,EACnBC,SAAiB,EACjBN,YAAoB,EACpBC,WAAmC,EACnChB,UAAmB,EACb;IACN,IAAI,CAACsB,OAAO,CAAC,CAAC;IACd,IAAI,CAACR,SAAS,GAAG,KAAK;IAEtB,MAAMS,QAAQ,GAAGvB,UAAU,GAAGF,mBAAmB,CAACqB,MAAM,EAAEnB,UAAU,CAAC,GAAGmB,MAAM;IAC9E,MAAMK,MAAM,GAAGD,QAAQ,CAACE,MAAM,KAAK,OAAO;IAC1C,MAAMC,QAAQ,GAAGF,MAAM,GAAG,KAAK,GAAG,IAAI;IACtC,IAAI,CAACP,KAAK,GAAG,GAAGS,QAAQ,MAAMH,QAAQ,CAACtB,IAAI,IAAIsB,QAAQ,CAACI,IAAI,QAAQJ,QAAQ,CAACK,GAAG,aAAalC,eAAe,0BAA0B;IACtI,IAAI,CAACe,WAAW,GAAG,qBAAqBW,WAAW,YAAYC,SAAS,EAAE;IAC1E,IAAI,CAACN,YAAY,GAAGA,YAAY;IAChC,IAAI,CAACC,WAAW,GAAGA,WAAW;IAE9B,IAAI,CAACa,UAAU,CAAC,CAAC;EACnB;EAEAC,UAAUA,CAAA,EAAS;IACjB,IAAI,CAACR,OAAO,CAAC,CAAC;EAChB;EAEAS,WAAWA,CAAA,EAAY;IACrB,OAAO,IAAI,CAACxB,EAAE,EAAEyB,UAAU,KAAKC,SAAS,CAACC,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC1B,QAAQ;EAClE;EAEA2B,EAAEA,CAACC,KAAoB,EAAEC,OAAwB,EAAc;IAC7D,IAAI,CAAC,IAAI,CAAC3B,QAAQ,CAAC4B,GAAG,CAACF,KAAK,CAAC,EAAE;MAC7B,IAAI,CAAC1B,QAAQ,CAAC6B,GAAG,CAACH,KAAK,EAAE,IAAIvC,GAAG,CAAC,CAAC,CAAC;IACrC;IACA,IAAI,CAACa,QAAQ,CAAC8B,GAAG,CAACJ,KAAK,CAAC,CAAEK,GAAG,CAACJ,OAAO,CAAC;IACtC,OAAO,MAAM,IAAI,CAAC3B,QAAQ,CAAC8B,GAAG,CAACJ,KAAK,CAAC,EAAEM,MAAM,CAACL,OAAO,CAAC;EACxD;;EAEA;;EAEQR,UAAUA,CAAA,EAAS;IACzB,IAAI;MACF,IAAI,CAACtB,EAAE,GAAG,IAAI0B,SAAS,CAAC,IAAI,CAAChB,KAAK,CAAC;IACrC,CAAC,CAAC,OAAO0B,CAAC,EAAE;MACV,IAAI,CAACC,iBAAiB,CAAC,CAAC;MACxB;IACF;IAEA,IAAI,CAACrC,EAAE,CAACsC,MAAM,GAAG,MAAM;MACrB;IAAA,CACD;IAED,IAAI,CAACtC,EAAE,CAACuC,SAAS,GAAIV,KAAK,IAAK;MAC7B,IAAI,CAACW,aAAa,CAACC,MAAM,CAACZ,KAAK,CAACa,IAAI,CAAC,CAAC;IACxC,CAAC;IAED,IAAI,CAAC1C,EAAE,CAAC2C,OAAO,GAAG,MAAM;MACtB;IAAA,CACD;IAED,IAAI,CAAC3C,EAAE,CAAC4C,OAAO,GAAG,MAAM;MACtB,IAAI,CAAC3C,QAAQ,GAAG,IAAI;MACpB,IAAI,CAAC4C,IAAI,CAAC,cAAc,CAAC;MACzB,IAAI,CAAC,IAAI,CAACtC,SAAS,EAAE;QACnB,IAAI,CAAC8B,iBAAiB,CAAC,CAAC;MAC1B;IACF,CAAC;EACH;EAEQG,aAAaA,CAACM,GAAW,EAAQ;IACvC,IAAIC,GAAwD;IAC5D,IAAI;MACFA,GAAG,GAAGC,IAAI,CAACC,KAAK,CAACH,GAAG,CAAC;IACvB,CAAC,CAAC,MAAM;MACN;IACF;IAEA,MAAMI,SAAS,GAAGH,GAAG,CAAClB,KAAK,IAAI,EAAE;IAEjC,QAAQqB,SAAS;MACf,KAAK,+BAA+B;QAAE;UACpC,MAAMR,IAAI,GACR,OAAOK,GAAG,CAACL,IAAI,KAAK,QAAQ,GAAGM,IAAI,CAACC,KAAK,CAACF,GAAG,CAACL,IAAI,CAAC,GAAGK,GAAG,CAACL,IAAI;UAChE,IAAI,CAACzC,QAAQ,GAAIyC,IAAI,CAA2BS,SAAS;UACzD,IAAI,CAAC9C,gBAAgB,GAAG,CAAC;UACzB,KAAK,IAAI,CAAC+C,SAAS,CAAC,CAAC;UACrB;QACF;MAEA,KAAK,aAAa;QAChB,IAAI,CAACC,IAAI,CAAC;UAAExB,KAAK,EAAE,aAAa;UAAEa,IAAI,EAAE,CAAC;QAAE,CAAC,CAAC;QAC7C;MAEF,KAAK,cAAc;QAAE;UACnB,MAAMY,OAAO,GAAG,IAAI,CAACC,SAAS,CAACR,GAAG,CAACL,IAAI,CAAC;UACxCc,OAAO,CAACC,IAAI,CAAC,gCAAgC,EAAEH,OAAO,CAAC;UACvD;QACF;MAEA,KAAK,wCAAwC;QAC3C,IAAI,CAACT,IAAI,CAAC,WAAW,CAAC;QACtB;MAEF,KAAK,2BAA2B;QAAE;UAChC,MAAMS,OAAO,GAAG,IAAI,CAACC,SAAS,CAACR,GAAG,CAACL,IAAI,CAAC;UACxCc,OAAO,CAACC,IAAI,CAAC,sCAAsC,EAAEH,OAAO,CAAC;UAC7D,IAAI,CAACT,IAAI,CAAC,cAAc,CAAC;UACzB;QACF;MAEA;QACE,IAAIxD,qBAAqB,CAAC0C,GAAG,CAACmB,SAAS,CAAC,EAAE;UACxC,IAAI,CAACL,IAAI,CAAC,kBAAkB,EAAE,IAAI,CAACU,SAAS,CAACR,GAAG,CAACL,IAAI,CAAC,CAAC;QACzD;QACA;IACJ;EACF;EAEA,MAAcU,SAASA,CAAA,EAAkB;IACvC,IAAI,CAAC,IAAI,CAAClD,WAAW,IAAI,CAAC,IAAI,CAACD,QAAQ,EAAE;IAEzC,IAAIyD,IAAI,GAAG,EAAE;IACb,IAAIC,WAAW,GAAG,EAAE;IACpB,IAAI;MACF,MAAMC,GAAG,GAAG,MAAMC,KAAK,CAAC,IAAI,CAACrD,YAAY,EAAE;QACzCsD,MAAM,EAAE,MAAM;QACdC,OAAO,EAAE;UACP,cAAc,EAAE,kBAAkB;UAClCC,MAAM,EAAE,kBAAkB;UAC1B,GAAG,IAAI,CAACvD;QACV,CAAC;QACDwD,IAAI,EAAEjB,IAAI,CAACkB,SAAS,CAAC;UACnBf,SAAS,EAAE,IAAI,CAAClD,QAAQ;UACxBkE,YAAY,EAAE,IAAI,CAACjE;QACrB,CAAC;MACH,CAAC,CAAC;MACF,IAAI0D,GAAG,CAACQ,EAAE,EAAE;QACV,MAAMH,IAAI,GAAI,MAAML,GAAG,CAACS,IAAI,CAAC,CAA8C;QAC3EX,IAAI,GAAGO,IAAI,CAACP,IAAI,IAAI,EAAE;QACtBC,WAAW,GAAGM,IAAI,CAACK,YAAY,IAAI,EAAE;MACvC,CAAC,MAAM;QACL,MAAML,IAAI,GAAG,MAAML,GAAG,CAACW,IAAI,CAAC,CAAC,CAACC,KAAK,CAAC,MAAM,EAAE,CAAC;QAC7ChB,OAAO,CAACC,IAAI,CAAC,6BAA6B,EAAEG,GAAG,CAACa,MAAM,EAAER,IAAI,CAAC;MAC/D;IACF,CAAC,CAAC,OAAO7B,CAAC,EAAE;MACVoB,OAAO,CAACC,IAAI,CAAC,uCAAuC,EAAErB,CAAC,CAAC;IAC1D;IAEA,IAAI,CAACsB,IAAI,EAAE;IACX,IAAI,IAAI,CAAC1D,EAAE,EAAEyB,UAAU,KAAKC,SAAS,CAACC,IAAI,EAAE;IAE5C,MAAM+C,OAA+B,GAAG;MACtCC,OAAO,EAAE,IAAI,CAACzE,WAAW;MACzBwD;IACF,CAAC;IACD;IACA,IAAIC,WAAW,EAAE;MACfe,OAAO,CAACJ,YAAY,GAAGX,WAAW;IACpC;IAEA,IAAI,CAACN,IAAI,CAAC;MACRxB,KAAK,EAAE,kBAAkB;MACzBa,IAAI,EAAEgC;IACR,CAAC,CAAC;EACJ;EAEQrB,IAAIA,CAACqB,OAAgB,EAAQ;IACnC,IAAI,IAAI,CAAC1E,EAAE,EAAEyB,UAAU,KAAKC,SAAS,CAACC,IAAI,EAAE;MAC1C,IAAI,CAAC3B,EAAE,CAACqD,IAAI,CAACL,IAAI,CAACkB,SAAS,CAACQ,OAAO,CAAC,CAAC;IACvC;EACF;EAEQrC,iBAAiBA,CAAA,EAAS;IAChC,IAAI,IAAI,CAAC9B,SAAS,EAAE;IACpB,MAAMqE,KAAK,GACTxF,gBAAgB,CAACyF,IAAI,CAACC,GAAG,CAAC,IAAI,CAACzE,gBAAgB,EAAEjB,gBAAgB,CAAC2F,MAAM,GAAG,CAAC,CAAC,CAAC;IAChF,IAAI,CAAC1E,gBAAgB,EAAE;IACvB,IAAI,CAACC,cAAc,GAAG0E,UAAU,CAAC,MAAM;MACrC,IAAI,CAAC,IAAI,CAACzE,SAAS,EAAE,IAAI,CAACe,UAAU,CAAC,CAAC;IACxC,CAAC,EAAEsD,KAAK,CAAC;EACX;EAEQ7D,OAAOA,CAAA,EAAS;IACtB,IAAI,CAACR,SAAS,GAAG,IAAI;IACrB,IAAI,IAAI,CAACD,cAAc,EAAE;MACvB2E,YAAY,CAAC,IAAI,CAAC3E,cAAc,CAAC;MACjC,IAAI,CAACA,cAAc,GAAG,IAAI;IAC5B;IACA,IAAI,IAAI,CAACN,EAAE,EAAE;MACX,IAAI,CAACA,EAAE,CAACsC,MAAM,GAAG,IAAI;MACrB,IAAI,CAACtC,EAAE,CAACuC,SAAS,GAAG,IAAI;MACxB,IAAI,CAACvC,EAAE,CAAC2C,OAAO,GAAG,IAAI;MACtB,IAAI,CAAC3C,EAAE,CAAC4C,OAAO,GAAG,IAAI;MACtB,IAAI,CAAC5C,EAAE,CAACkF,KAAK,CAAC,CAAC;MACf,IAAI,CAAClF,EAAE,GAAG,IAAI;IAChB;IACA,IAAI,CAACC,QAAQ,GAAG,IAAI;EACtB;EAEQsD,SAASA,CAACb,IAAa,EAAW;IACxC,IAAI,OAAOA,IAAI,KAAK,QAAQ,EAAE;MAC5B,IAAI;QACF,OAAOM,IAAI,CAACC,KAAK,CAACP,IAAI,CAAC;MACzB,CAAC,CAAC,MAAM;QACN,OAAOA,IAAI;MACb;IACF;IACA,OAAOA,IAAI;EACb;EAEQG,IAAIA,CAAChB,KAAoB,EAAEa,IAAc,EAAQ;IACvD,IAAI,CAACvC,QAAQ,CAAC8B,GAAG,CAACJ,KAAK,CAAC,EAAEsD,OAAO,CAAEC,CAAC,IAAKA,CAAC,CAAC1C,IAAI,CAAC,CAAC;EACnD;AACF","ignoreList":[]}
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+
3
+ import { Platform, StatusBar } from 'react-native';
4
+
5
+ /** Верхний отступ под status bar (Android). На iOS используйте SafeAreaView. */
6
+ export function getAndroidStatusBarHeight() {
7
+ return StatusBar.currentHeight ?? 24;
8
+ }
9
+ export const INPUT_BOTTOM_PADDING = Platform.select({
10
+ ios: 0,
11
+ android: 12,
12
+ default: 12
13
+ }) ?? 12;
14
+ //# sourceMappingURL=safeArea.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["Platform","StatusBar","getAndroidStatusBarHeight","currentHeight","INPUT_BOTTOM_PADDING","select","ios","android","default"],"sourceRoot":"..\\..\\src","sources":["safeArea.ts"],"mappings":";;AAAA,SAASA,QAAQ,EAAEC,SAAS,QAAQ,cAAc;;AAElD;AACA,OAAO,SAASC,yBAAyBA,CAAA,EAAW;EAClD,OAAOD,SAAS,CAACE,aAAa,IAAI,EAAE;AACtC;AAEA,OAAO,MAAMC,oBAAoB,GAAGJ,QAAQ,CAACK,MAAM,CAAC;EAAEC,GAAG,EAAE,CAAC;EAAEC,OAAO,EAAE,EAAE;EAAEC,OAAO,EAAE;AAAG,CAAC,CAAC,IAAI,EAAE","ignoreList":[]}
@@ -0,0 +1,154 @@
1
+ "use strict";
2
+
3
+ import { AppState } from 'react-native';
4
+ import { RealtimeClient } from "./realtime.js";
5
+ const POLL_INTERVAL_MS = 5000;
6
+ /**
7
+ * Время жизни — от ChatSDK.login() до ChatSDK.logout().
8
+ * Один источник правды для realtime + polling + кэша сообщений/оператора.
9
+ * События проксируются в ChatSDK через emitters.
10
+ */
11
+ export class ChatSDKSession {
12
+ realtime = null;
13
+ pollTimer = null;
14
+ appStateSub = null;
15
+ destroyed = false;
16
+ refreshing = false;
17
+ messages = [];
18
+ operator = null;
19
+ knownMessageIds = new Set();
20
+ initialLoaded = false;
21
+ connected = false;
22
+ constructor(api, sdkConfig, widgetToken, baseUrl, emitters) {
23
+ this.api = api;
24
+ this.sdkConfig = sdkConfig;
25
+ this.widgetToken = widgetToken;
26
+ this.baseUrl = baseUrl;
27
+ this.emitters = emitters;
28
+ }
29
+ start() {
30
+ this.openRealtime();
31
+ this.appStateSub = AppState.addEventListener('change', this.handleAppStateChange);
32
+ void this.refreshMessages();
33
+ }
34
+ destroy() {
35
+ this.destroyed = true;
36
+ this.realtime?.disconnect();
37
+ this.realtime = null;
38
+ this.stopPolling();
39
+ this.appStateSub?.remove();
40
+ this.appStateSub = null;
41
+ this.messages = [];
42
+ this.operator = null;
43
+ this.knownMessageIds.clear();
44
+ this.initialLoaded = false;
45
+ if (this.connected) {
46
+ this.connected = false;
47
+ this.emitters.emitConnectedChange(false);
48
+ }
49
+ }
50
+ getMessages() {
51
+ return this.messages;
52
+ }
53
+ getOperator() {
54
+ return this.operator;
55
+ }
56
+ isConnected() {
57
+ return this.connected;
58
+ }
59
+ async refreshMessages() {
60
+ if (this.destroyed || this.refreshing) return;
61
+ this.refreshing = true;
62
+ try {
63
+ const data = await this.api.getMessages();
64
+ if (this.destroyed) return;
65
+ const incoming = data.messages ?? [];
66
+ const nextOperator = data.operator ?? null;
67
+ if (this.initialLoaded) {
68
+ this.detectOperatorChange(nextOperator);
69
+ this.detectNewMessages(incoming, nextOperator);
70
+ }
71
+ this.messages = incoming;
72
+ this.operator = nextOperator;
73
+ this.knownMessageIds = new Set(incoming.map(m => m.id));
74
+ this.initialLoaded = true;
75
+ this.emitters.emitMessagesUpdated(incoming, nextOperator);
76
+ } catch (e) {
77
+ // Тихо — UI-слой (useChat) сам показывает ошибки своих явных действий.
78
+ // Фоновый refresh не должен ронять чат, если на короткое время пропала сеть.
79
+ if (this.initialLoaded) return;
80
+ throw e;
81
+ } finally {
82
+ this.refreshing = false;
83
+ }
84
+ }
85
+ detectOperatorChange(nextOperator) {
86
+ const prevId = this.operator?.id ?? null;
87
+ const nextId = nextOperator?.id ?? null;
88
+ if (prevId === nextId) return;
89
+ const contactId = this.api.getContactId();
90
+ if (!contactId) return;
91
+ this.emitters.emitOperatorChanged({
92
+ token: this.widgetToken,
93
+ contactId,
94
+ previousOperator: this.operator,
95
+ operator: nextOperator,
96
+ occurredAt: new Date().toISOString()
97
+ });
98
+ }
99
+ detectNewMessages(incoming, nextOperator) {
100
+ const contactId = this.api.getContactId();
101
+ if (!contactId) return;
102
+ for (const message of incoming) {
103
+ if (this.knownMessageIds.has(message.id)) continue;
104
+ if (message.type !== 'user') continue;
105
+ this.emitters.emitNewMessage({
106
+ token: this.widgetToken,
107
+ contactId,
108
+ message,
109
+ operator: nextOperator,
110
+ occurredAt: new Date().toISOString()
111
+ });
112
+ }
113
+ }
114
+ openRealtime() {
115
+ const contactId = this.api.getContactId();
116
+ if (!contactId) return;
117
+ const rt = new RealtimeClient();
118
+ this.realtime = rt;
119
+ rt.on('connected', () => this.setConnected(true));
120
+ rt.on('disconnected', () => this.setConnected(false));
121
+ rt.on('messages_updated', () => void this.refreshMessages());
122
+ rt.connect(this.sdkConfig.reverb, this.widgetToken, contactId, this.api.getBroadcastAuthEndpoint(), this.api.getAuthHeaders(), this.baseUrl || this.sdkConfig.apiBaseUrl);
123
+ }
124
+ setConnected(value) {
125
+ if (this.connected === value) return;
126
+ this.connected = value;
127
+ this.emitters.emitConnectedChange(value);
128
+ if (value) {
129
+ this.stopPolling();
130
+ } else {
131
+ this.startPolling();
132
+ }
133
+ }
134
+ startPolling() {
135
+ if (this.pollTimer || this.destroyed) return;
136
+ if (AppState.currentState !== 'active') return;
137
+ this.pollTimer = setInterval(() => void this.refreshMessages(), POLL_INTERVAL_MS);
138
+ }
139
+ stopPolling() {
140
+ if (!this.pollTimer) return;
141
+ clearInterval(this.pollTimer);
142
+ this.pollTimer = null;
143
+ }
144
+ handleAppStateChange = next => {
145
+ if (this.destroyed) return;
146
+ if (next === 'active') {
147
+ void this.refreshMessages();
148
+ if (!this.connected) this.startPolling();
149
+ } else {
150
+ this.stopPolling();
151
+ }
152
+ };
153
+ }
154
+ //# sourceMappingURL=session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["AppState","RealtimeClient","POLL_INTERVAL_MS","ChatSDKSession","realtime","pollTimer","appStateSub","destroyed","refreshing","messages","operator","knownMessageIds","Set","initialLoaded","connected","constructor","api","sdkConfig","widgetToken","baseUrl","emitters","start","openRealtime","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","on","setConnected","connect","reverb","getBroadcastAuthEndpoint","getAuthHeaders","apiBaseUrl","value","startPolling","currentState","setInterval","clearInterval","next"],"sourceRoot":"..\\..\\src","sources":["session.ts"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+
3
+ const cache = new Map();
4
+ export function isSurveyEventSeen(contactId, messageId) {
5
+ return cache.get(contactId)?.has(messageId) ?? false;
6
+ }
7
+ export function markSurveyEventSeen(contactId, messageId) {
8
+ if (!cache.has(contactId)) {
9
+ cache.set(contactId, new Set());
10
+ }
11
+ cache.get(contactId).add(messageId);
12
+ }
13
+ export function deleteSurveyEvent(contactId, messageId) {
14
+ cache.get(contactId)?.delete(messageId);
15
+ }
16
+ export function clearSurveyCache(contactId) {
17
+ if (contactId) {
18
+ cache.delete(contactId);
19
+ } else {
20
+ cache.clear();
21
+ }
22
+ }
23
+ //# 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;AAE5C,OAAO,SAASC,iBAAiBA,CAACC,SAAiB,EAAEC,SAAiB,EAAW;EAC/E,OAAOJ,KAAK,CAACK,GAAG,CAACF,SAAS,CAAC,EAAEG,GAAG,CAACF,SAAS,CAAC,IAAI,KAAK;AACtD;AAEA,OAAO,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;AAEA,OAAO,SAASO,iBAAiBA,CAACR,SAAiB,EAAEC,SAAiB,EAAQ;EAC5EJ,KAAK,CAACK,GAAG,CAACF,SAAS,CAAC,EAAES,MAAM,CAACR,SAAS,CAAC;AACzC;AAEA,OAAO,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,25 @@
1
+ "use strict";
2
+
3
+ export function buildTheme(config) {
4
+ const primary = config?.themeColor ?? '#2d8ef0';
5
+ const isGradient = config?.colorType === 'gradient' && !!config?.colorStart && !!config?.colorEnd;
6
+ return {
7
+ primaryColor: primary,
8
+ primaryColorStart: config?.colorStart ?? null,
9
+ primaryColorEnd: config?.colorEnd ?? null,
10
+ isGradient,
11
+ outboundBg: primary,
12
+ inboundBg: '#f0f0f5',
13
+ outboundText: '#ffffff',
14
+ inboundText: '#1a1a1a',
15
+ background: '#ffffff',
16
+ inputBg: '#f7f7f9',
17
+ inputBorder: '#e0e0e8',
18
+ inputText: '#1a1a1a',
19
+ systemText: '#9999aa',
20
+ headerBg: primary,
21
+ headerText: '#ffffff',
22
+ sendButtonBg: primary
23
+ };
24
+ }
25
+ //# 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":";;AAuBA,OAAO,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":[]}
@@ -0,0 +1,141 @@
1
+ "use strict";
2
+
3
+ import { useCallback, useEffect, useRef, useState } from 'react';
4
+ import { ChatSDK } from "./ChatSDK.js";
5
+ import { isSurveyEventSeen, markSurveyEventSeen, deleteSurveyEvent } from "./surveyCache.js";
6
+ function filterVisible(all) {
7
+ return all.filter(m => !(m.type === 'event' && m.text === 'status_changed'));
8
+ }
9
+ export function useChat() {
10
+ const [messages, setMessages] = useState(() => filterVisible(ChatSDK.getMessages()));
11
+ const [isLoading, setIsLoading] = useState(ChatSDK.getMessages().length === 0);
12
+ const [isSending, setIsSending] = useState(false);
13
+ const [connected, setConnected] = useState(ChatSDK.isRealtimeConnected());
14
+ const [error, setError] = useState(null);
15
+ const [survey, setSurvey] = useState(null);
16
+ const api = ChatSDK.getApi();
17
+ const lastCloseEventRef = useRef(null);
18
+ const checkSurvey = useCallback(async (eventMessageId, closeEventCreatedAt) => {
19
+ const contactId = api.getContactId();
20
+ if (!contactId) return;
21
+ if (isSurveyEventSeen(contactId, eventMessageId)) return;
22
+ markSurveyEventSeen(contactId, eventMessageId);
23
+ try {
24
+ const cfg = await api.getSurveyConfig(closeEventCreatedAt);
25
+ if (cfg.visible) {
26
+ setSurvey(cfg);
27
+ }
28
+ } catch {
29
+ deleteSurveyEvent(contactId, eventMessageId);
30
+ }
31
+ }, [api]);
32
+ useEffect(() => {
33
+ const unsubMessages = ChatSDK.on('messagesUpdated', ({
34
+ messages: all
35
+ }) => {
36
+ setMessages(filterVisible(all));
37
+ setIsLoading(false);
38
+ setError(null);
39
+ const closeEvent = all.findLast(m => m.type === 'event' && m.text === 'status_changed');
40
+ if (closeEvent && closeEvent.id !== lastCloseEventRef.current) {
41
+ lastCloseEventRef.current = closeEvent.id;
42
+ void checkSurvey(closeEvent.id, closeEvent.createdAt);
43
+ }
44
+ });
45
+ const unsubConnected = ChatSDK.on('connectedChange', value => setConnected(value));
46
+ return () => {
47
+ unsubMessages();
48
+ unsubConnected();
49
+ };
50
+ }, [checkSurvey]);
51
+ useEffect(() => {
52
+ void (async () => {
53
+ try {
54
+ const user = ChatSDK.getUser();
55
+ await api.startDialog({
56
+ name: user?.name,
57
+ surname: user?.surname,
58
+ email: user?.email,
59
+ phone: user?.phone
60
+ });
61
+ } catch (e) {
62
+ console.warn('ChatSDK: startDialog failed (non-fatal):', e);
63
+ }
64
+ try {
65
+ await ChatSDK.refreshMessages();
66
+ } catch (e) {
67
+ setError(e instanceof Error ? e.message : 'Ошибка загрузки');
68
+ setIsLoading(false);
69
+ }
70
+ })();
71
+ }, [api]);
72
+ const sendMessage = useCallback(async (text, files) => {
73
+ if (!text.trim() && (!files || files.length === 0)) return;
74
+ setIsSending(true);
75
+ setError(null);
76
+ const tempId = `temp-${Date.now()}`;
77
+ const tempAttachments = (files ?? []).map((f, i) => ({
78
+ id: -(i + 1),
79
+ url: f.uri,
80
+ filename: f.name,
81
+ mime: f.type,
82
+ size: f.size ?? 0,
83
+ type: f.type.startsWith('image/') ? 'image' : f.type.startsWith('video/') ? 'video' : f.type.startsWith('audio/') ? 'audio' : 'document'
84
+ }));
85
+ const tempMsg = {
86
+ id: tempId,
87
+ type: 'contact',
88
+ text: text.trim() || null,
89
+ time: new Date().toLocaleTimeString('ru', {
90
+ hour: '2-digit',
91
+ minute: '2-digit'
92
+ }),
93
+ createdAt: Date.now(),
94
+ attachments: tempAttachments
95
+ };
96
+ setMessages(prev => [...prev, tempMsg]);
97
+ try {
98
+ await api.sendMessage(text, files);
99
+ await ChatSDK.refreshMessages();
100
+ } catch (e) {
101
+ setError(e instanceof Error ? e.message : 'Ошибка отправки');
102
+ setMessages(prev => prev.filter(m => m.id !== tempId));
103
+ } finally {
104
+ setIsSending(false);
105
+ }
106
+ }, [api]);
107
+ const sendCallback = useCallback(async (messageId, callbackData) => {
108
+ try {
109
+ await api.sendCallback(messageId, callbackData);
110
+ await ChatSDK.refreshMessages();
111
+ } catch (e) {
112
+ setError(e instanceof Error ? e.message : 'Ошибка отправки');
113
+ }
114
+ }, [api]);
115
+ const submitSurvey = useCallback(async (rating, comment) => {
116
+ await api.submitCsi(rating, comment);
117
+ }, [api]);
118
+ const dismissSurvey = useCallback(() => setSurvey(null), []);
119
+ const retry = useCallback(() => {
120
+ setIsLoading(true);
121
+ setError(null);
122
+ void ChatSDK.refreshMessages().catch(e => {
123
+ setError(e instanceof Error ? e.message : 'Ошибка загрузки');
124
+ setIsLoading(false);
125
+ });
126
+ }, []);
127
+ return {
128
+ messages,
129
+ isLoading,
130
+ isSending,
131
+ connected,
132
+ error,
133
+ survey,
134
+ sendMessage,
135
+ sendCallback,
136
+ submitSurvey,
137
+ dismissSurvey,
138
+ retry
139
+ };
140
+ }
141
+ //# sourceMappingURL=useChat.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["useCallback","useEffect","useRef","useState","ChatSDK","isSurveyEventSeen","markSurveyEventSeen","deleteSurveyEvent","filterVisible","all","filter","m","type","text","useChat","messages","setMessages","getMessages","isLoading","setIsLoading","length","isSending","setIsSending","connected","setConnected","isRealtimeConnected","error","setError","survey","setSurvey","api","getApi","lastCloseEventRef","checkSurvey","eventMessageId","closeEventCreatedAt","contactId","getContactId","cfg","getSurveyConfig","visible","unsubMessages","on","closeEvent","findLast","id","current","createdAt","unsubConnected","value","user","getUser","startDialog","name","surname","email","phone","e","console","warn","refreshMessages","Error","message","sendMessage","files","trim","tempId","Date","now","tempAttachments","map","f","i","url","uri","filename","mime","size","startsWith","tempMsg","time","toLocaleTimeString","hour","minute","attachments","prev","sendCallback","messageId","callbackData","submitSurvey","rating","comment","submitCsi","dismissSurvey","retry","catch"],"sourceRoot":"..\\..\\src","sources":["useChat.ts"],"mappings":"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","ignoreList":[]}