@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.
- package/CHANGELOG.md +17 -0
- package/ChatPlatformSdk.podspec +20 -0
- package/README.md +315 -0
- package/android/build.gradle +54 -0
- package/android/src/main/AndroidManifest.xml +18 -0
- package/android/src/main/java/com/chatplatform/sdk/ChatSdkDownloaderModule.kt +240 -0
- package/android/src/main/java/com/chatplatform/sdk/ChatSdkFilePickerModule.kt +165 -0
- package/android/src/main/java/com/chatplatform/sdk/ChatSdkPackage.kt +15 -0
- package/android/src/main/res/xml/chat_sdk_file_paths.xml +7 -0
- package/ios/ChatSdkDownloader.m +10 -0
- package/ios/ChatSdkDownloader.swift +141 -0
- package/ios/ChatSdkFilePicker.m +9 -0
- package/ios/ChatSdkFilePicker.swift +161 -0
- package/lib/commonjs/ChatSDK.js +193 -0
- package/lib/commonjs/ChatSDK.js.map +1 -0
- package/lib/commonjs/api.js +195 -0
- package/lib/commonjs/api.js.map +1 -0
- package/lib/commonjs/attachmentUtils.js +39 -0
- package/lib/commonjs/attachmentUtils.js.map +1 -0
- package/lib/commonjs/components/AttachmentGallery.js +367 -0
- package/lib/commonjs/components/AttachmentGallery.js.map +1 -0
- package/lib/commonjs/components/ChatScreen.js +286 -0
- package/lib/commonjs/components/ChatScreen.js.map +1 -0
- package/lib/commonjs/components/MessageBubble.js +227 -0
- package/lib/commonjs/components/MessageBubble.js.map +1 -0
- package/lib/commonjs/components/MessageInput.js +273 -0
- package/lib/commonjs/components/MessageInput.js.map +1 -0
- package/lib/commonjs/components/SurveyOverlay.js +499 -0
- package/lib/commonjs/components/SurveyOverlay.js.map +1 -0
- package/lib/commonjs/downloaders/defaultAttachmentDownloader.js +28 -0
- package/lib/commonjs/downloaders/defaultAttachmentDownloader.js.map +1 -0
- package/lib/commonjs/filePicker.js +25 -0
- package/lib/commonjs/filePicker.js.map +1 -0
- package/lib/commonjs/index.js +27 -0
- package/lib/commonjs/index.js.map +1 -0
- package/lib/commonjs/native/NativeChatSdkDownloader.js +28 -0
- package/lib/commonjs/native/NativeChatSdkDownloader.js.map +1 -0
- package/lib/commonjs/native/NativeChatSdkFilePicker.js +17 -0
- package/lib/commonjs/native/NativeChatSdkFilePicker.js.map +1 -0
- package/lib/commonjs/package.json +1 -0
- package/lib/commonjs/realtime.js +242 -0
- package/lib/commonjs/realtime.js.map +1 -0
- package/lib/commonjs/safeArea.js +18 -0
- package/lib/commonjs/safeArea.js.map +1 -0
- package/lib/commonjs/session.js +159 -0
- package/lib/commonjs/session.js.map +1 -0
- package/lib/commonjs/surveyCache.js +30 -0
- package/lib/commonjs/surveyCache.js.map +1 -0
- package/lib/commonjs/theme.js +29 -0
- package/lib/commonjs/theme.js.map +1 -0
- package/lib/commonjs/types.js +2 -0
- package/lib/commonjs/types.js.map +1 -0
- package/lib/commonjs/useChat.js +145 -0
- package/lib/commonjs/useChat.js.map +1 -0
- package/lib/module/ChatSDK.js +189 -0
- package/lib/module/ChatSDK.js.map +1 -0
- package/lib/module/api.js +190 -0
- package/lib/module/api.js.map +1 -0
- package/lib/module/attachmentUtils.js +33 -0
- package/lib/module/attachmentUtils.js.map +1 -0
- package/lib/module/components/AttachmentGallery.js +362 -0
- package/lib/module/components/AttachmentGallery.js.map +1 -0
- package/lib/module/components/ChatScreen.js +281 -0
- package/lib/module/components/ChatScreen.js.map +1 -0
- package/lib/module/components/MessageBubble.js +222 -0
- package/lib/module/components/MessageBubble.js.map +1 -0
- package/lib/module/components/MessageInput.js +268 -0
- package/lib/module/components/MessageInput.js.map +1 -0
- package/lib/module/components/SurveyOverlay.js +494 -0
- package/lib/module/components/SurveyOverlay.js.map +1 -0
- package/lib/module/downloaders/defaultAttachmentDownloader.js +22 -0
- package/lib/module/downloaders/defaultAttachmentDownloader.js.map +1 -0
- package/lib/module/filePicker.js +20 -0
- package/lib/module/filePicker.js.map +1 -0
- package/lib/module/index.js +6 -0
- package/lib/module/index.js.map +1 -0
- package/lib/module/native/NativeChatSdkDownloader.js +23 -0
- package/lib/module/native/NativeChatSdkDownloader.js.map +1 -0
- package/lib/module/native/NativeChatSdkFilePicker.js +13 -0
- package/lib/module/native/NativeChatSdkFilePicker.js.map +1 -0
- package/lib/module/package.json +1 -0
- package/lib/module/realtime.js +236 -0
- package/lib/module/realtime.js.map +1 -0
- package/lib/module/safeArea.js +14 -0
- package/lib/module/safeArea.js.map +1 -0
- package/lib/module/session.js +154 -0
- package/lib/module/session.js.map +1 -0
- package/lib/module/surveyCache.js +23 -0
- package/lib/module/surveyCache.js.map +1 -0
- package/lib/module/theme.js +25 -0
- package/lib/module/theme.js.map +1 -0
- package/lib/module/types.js +2 -0
- package/lib/module/types.js.map +1 -0
- package/lib/module/useChat.js +141 -0
- package/lib/module/useChat.js.map +1 -0
- package/lib/typescript/commonjs/ChatSDK.d.ts +49 -0
- package/lib/typescript/commonjs/ChatSDK.d.ts.map +1 -0
- package/lib/typescript/commonjs/api.d.ts +31 -0
- package/lib/typescript/commonjs/api.d.ts.map +1 -0
- package/lib/typescript/commonjs/attachmentUtils.d.ts +12 -0
- package/lib/typescript/commonjs/attachmentUtils.d.ts.map +1 -0
- package/lib/typescript/commonjs/components/AttachmentGallery.d.ts +16 -0
- package/lib/typescript/commonjs/components/AttachmentGallery.d.ts.map +1 -0
- package/lib/typescript/commonjs/components/ChatScreen.d.ts +16 -0
- package/lib/typescript/commonjs/components/ChatScreen.d.ts.map +1 -0
- package/lib/typescript/commonjs/components/MessageBubble.d.ts +12 -0
- package/lib/typescript/commonjs/components/MessageBubble.d.ts.map +1 -0
- package/lib/typescript/commonjs/components/MessageInput.d.ts +14 -0
- package/lib/typescript/commonjs/components/MessageInput.d.ts.map +1 -0
- package/lib/typescript/commonjs/components/SurveyOverlay.d.ts +13 -0
- package/lib/typescript/commonjs/components/SurveyOverlay.d.ts.map +1 -0
- package/lib/typescript/commonjs/downloaders/defaultAttachmentDownloader.d.ts +3 -0
- package/lib/typescript/commonjs/downloaders/defaultAttachmentDownloader.d.ts.map +1 -0
- package/lib/typescript/commonjs/filePicker.d.ts +4 -0
- package/lib/typescript/commonjs/filePicker.d.ts.map +1 -0
- package/lib/typescript/commonjs/index.d.ts +7 -0
- package/lib/typescript/commonjs/index.d.ts.map +1 -0
- package/lib/typescript/commonjs/native/NativeChatSdkDownloader.d.ts +24 -0
- package/lib/typescript/commonjs/native/NativeChatSdkDownloader.d.ts.map +1 -0
- package/lib/typescript/commonjs/native/NativeChatSdkFilePicker.d.ts +17 -0
- package/lib/typescript/commonjs/native/NativeChatSdkFilePicker.d.ts.map +1 -0
- package/lib/typescript/commonjs/package.json +1 -0
- package/lib/typescript/commonjs/realtime.d.ts +42 -0
- package/lib/typescript/commonjs/realtime.d.ts.map +1 -0
- package/lib/typescript/commonjs/safeArea.d.ts +4 -0
- package/lib/typescript/commonjs/safeArea.d.ts.map +1 -0
- package/lib/typescript/commonjs/session.d.ts +45 -0
- package/lib/typescript/commonjs/session.d.ts.map +1 -0
- package/lib/typescript/commonjs/surveyCache.d.ts +5 -0
- package/lib/typescript/commonjs/surveyCache.d.ts.map +1 -0
- package/lib/typescript/commonjs/theme.d.ts +21 -0
- package/lib/typescript/commonjs/theme.d.ts.map +1 -0
- package/lib/typescript/commonjs/types.d.ts +156 -0
- package/lib/typescript/commonjs/types.d.ts.map +1 -0
- package/lib/typescript/commonjs/useChat.d.ts +16 -0
- package/lib/typescript/commonjs/useChat.d.ts.map +1 -0
- package/lib/typescript/module/ChatSDK.d.ts +49 -0
- package/lib/typescript/module/ChatSDK.d.ts.map +1 -0
- package/lib/typescript/module/api.d.ts +31 -0
- package/lib/typescript/module/api.d.ts.map +1 -0
- package/lib/typescript/module/attachmentUtils.d.ts +12 -0
- package/lib/typescript/module/attachmentUtils.d.ts.map +1 -0
- package/lib/typescript/module/components/AttachmentGallery.d.ts +16 -0
- package/lib/typescript/module/components/AttachmentGallery.d.ts.map +1 -0
- package/lib/typescript/module/components/ChatScreen.d.ts +16 -0
- package/lib/typescript/module/components/ChatScreen.d.ts.map +1 -0
- package/lib/typescript/module/components/MessageBubble.d.ts +12 -0
- package/lib/typescript/module/components/MessageBubble.d.ts.map +1 -0
- package/lib/typescript/module/components/MessageInput.d.ts +14 -0
- package/lib/typescript/module/components/MessageInput.d.ts.map +1 -0
- package/lib/typescript/module/components/SurveyOverlay.d.ts +13 -0
- package/lib/typescript/module/components/SurveyOverlay.d.ts.map +1 -0
- package/lib/typescript/module/downloaders/defaultAttachmentDownloader.d.ts +3 -0
- package/lib/typescript/module/downloaders/defaultAttachmentDownloader.d.ts.map +1 -0
- package/lib/typescript/module/filePicker.d.ts +4 -0
- package/lib/typescript/module/filePicker.d.ts.map +1 -0
- package/lib/typescript/module/index.d.ts +7 -0
- package/lib/typescript/module/index.d.ts.map +1 -0
- package/lib/typescript/module/native/NativeChatSdkDownloader.d.ts +24 -0
- package/lib/typescript/module/native/NativeChatSdkDownloader.d.ts.map +1 -0
- package/lib/typescript/module/native/NativeChatSdkFilePicker.d.ts +17 -0
- package/lib/typescript/module/native/NativeChatSdkFilePicker.d.ts.map +1 -0
- package/lib/typescript/module/package.json +1 -0
- package/lib/typescript/module/realtime.d.ts +42 -0
- package/lib/typescript/module/realtime.d.ts.map +1 -0
- package/lib/typescript/module/safeArea.d.ts +4 -0
- package/lib/typescript/module/safeArea.d.ts.map +1 -0
- package/lib/typescript/module/session.d.ts +45 -0
- package/lib/typescript/module/session.d.ts.map +1 -0
- package/lib/typescript/module/surveyCache.d.ts +5 -0
- package/lib/typescript/module/surveyCache.d.ts.map +1 -0
- package/lib/typescript/module/theme.d.ts +21 -0
- package/lib/typescript/module/theme.d.ts.map +1 -0
- package/lib/typescript/module/types.d.ts +156 -0
- package/lib/typescript/module/types.d.ts.map +1 -0
- package/lib/typescript/module/useChat.d.ts +16 -0
- package/lib/typescript/module/useChat.d.ts.map +1 -0
- package/package.json +75 -0
- package/react-native.config.js +10 -0
- package/src/ChatSDK.ts +237 -0
- package/src/api.ts +228 -0
- package/src/attachmentUtils.ts +49 -0
- package/src/components/AttachmentGallery.tsx +363 -0
- package/src/components/ChatScreen.tsx +267 -0
- package/src/components/MessageBubble.tsx +208 -0
- package/src/components/MessageInput.tsx +280 -0
- package/src/components/SurveyOverlay.tsx +469 -0
- package/src/downloaders/defaultAttachmentDownloader.ts +27 -0
- package/src/filePicker.ts +22 -0
- package/src/index.ts +30 -0
- package/src/native/NativeChatSdkDownloader.ts +49 -0
- package/src/native/NativeChatSdkFilePicker.ts +30 -0
- package/src/realtime.ts +278 -0
- package/src/safeArea.ts +8 -0
- package/src/session.ts +196 -0
- package/src/surveyCache.ts +24 -0
- package/src/theme.ts +49 -0
- package/src/types.ts +199 -0
- 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":"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","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 @@
|
|
|
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":[]}
|