@vserifsaglam/chat-react-client 1.0.2
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/README.md +674 -0
- package/dist/api/chatApi.d.ts +143 -0
- package/dist/connection/ConnectionManager.d.ts +68 -0
- package/dist/connection/ConnectionManager.test.d.ts +1 -0
- package/dist/context/ChatContext.d.ts +20 -0
- package/dist/context/ConnectionContext.d.ts +28 -0
- package/dist/context/ConnectionContext.test.d.ts +1 -0
- package/dist/hooks/useBans.d.ts +14 -0
- package/dist/hooks/useClientProfile.d.ts +10 -0
- package/dist/hooks/useConnection.d.ts +14 -0
- package/dist/hooks/useConversationDetails.d.ts +15 -0
- package/dist/hooks/useConversationManagements.d.ts +12 -0
- package/dist/hooks/useConversations.d.ts +17 -0
- package/dist/hooks/useCustomEvents.d.ts +14 -0
- package/dist/hooks/useFiles.d.ts +10 -0
- package/dist/hooks/useLogging.d.ts +9 -0
- package/dist/hooks/useMessageManagements.d.ts +19 -0
- package/dist/hooks/useMessages.d.ts +23 -0
- package/dist/hooks/useQueue.d.ts +12 -0
- package/dist/hooks/useRealtime.d.ts +56 -0
- package/dist/index.d.ts +31 -0
- package/dist/index.js +3075 -0
- package/dist/index.js.map +1 -0
- package/dist/index.modern.js +3057 -0
- package/dist/index.modern.js.map +1 -0
- package/dist/index.test.d.ts +1 -0
- package/dist/types.d.ts +248 -0
- package/dist/utils/Logger.d.ts +37 -0
- package/package.json +68 -0
package/dist/index.js
ADDED
|
@@ -0,0 +1,3075 @@
|
|
|
1
|
+
function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; }
|
|
2
|
+
|
|
3
|
+
var React = require('react');
|
|
4
|
+
var React__default = _interopDefault(React);
|
|
5
|
+
var axios = _interopDefault(require('axios'));
|
|
6
|
+
var socket_ioClient = require('socket.io-client');
|
|
7
|
+
|
|
8
|
+
// A type of promise-like that resolves synchronously and supports only one observer
|
|
9
|
+
const _Pact = /*#__PURE__*/(function() {
|
|
10
|
+
function _Pact() {}
|
|
11
|
+
_Pact.prototype.then = function(onFulfilled, onRejected) {
|
|
12
|
+
const result = new _Pact();
|
|
13
|
+
const state = this.s;
|
|
14
|
+
if (state) {
|
|
15
|
+
const callback = state & 1 ? onFulfilled : onRejected;
|
|
16
|
+
if (callback) {
|
|
17
|
+
try {
|
|
18
|
+
_settle(result, 1, callback(this.v));
|
|
19
|
+
} catch (e) {
|
|
20
|
+
_settle(result, 2, e);
|
|
21
|
+
}
|
|
22
|
+
return result;
|
|
23
|
+
} else {
|
|
24
|
+
return this;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
this.o = function(_this) {
|
|
28
|
+
try {
|
|
29
|
+
const value = _this.v;
|
|
30
|
+
if (_this.s & 1) {
|
|
31
|
+
_settle(result, 1, onFulfilled ? onFulfilled(value) : value);
|
|
32
|
+
} else if (onRejected) {
|
|
33
|
+
_settle(result, 1, onRejected(value));
|
|
34
|
+
} else {
|
|
35
|
+
_settle(result, 2, value);
|
|
36
|
+
}
|
|
37
|
+
} catch (e) {
|
|
38
|
+
_settle(result, 2, e);
|
|
39
|
+
}
|
|
40
|
+
};
|
|
41
|
+
return result;
|
|
42
|
+
};
|
|
43
|
+
return _Pact;
|
|
44
|
+
})();
|
|
45
|
+
|
|
46
|
+
// Settles a pact synchronously
|
|
47
|
+
function _settle(pact, state, value) {
|
|
48
|
+
if (!pact.s) {
|
|
49
|
+
if (value instanceof _Pact) {
|
|
50
|
+
if (value.s) {
|
|
51
|
+
if (state & 1) {
|
|
52
|
+
state = value.s;
|
|
53
|
+
}
|
|
54
|
+
value = value.v;
|
|
55
|
+
} else {
|
|
56
|
+
value.o = _settle.bind(null, pact, state);
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
if (value && value.then) {
|
|
61
|
+
value.then(_settle.bind(null, pact, state), _settle.bind(null, pact, 2));
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
pact.s = state;
|
|
65
|
+
pact.v = value;
|
|
66
|
+
const observer = pact.o;
|
|
67
|
+
if (observer) {
|
|
68
|
+
observer(pact);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
function _isSettledPact(thenable) {
|
|
74
|
+
return thenable instanceof _Pact && thenable.s & 1;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
const _iteratorSymbol = /*#__PURE__*/ typeof Symbol !== "undefined" ? (Symbol.iterator || (Symbol.iterator = Symbol("Symbol.iterator"))) : "@@iterator";
|
|
78
|
+
|
|
79
|
+
const _asyncIteratorSymbol = /*#__PURE__*/ typeof Symbol !== "undefined" ? (Symbol.asyncIterator || (Symbol.asyncIterator = Symbol("Symbol.asyncIterator"))) : "@@asyncIterator";
|
|
80
|
+
|
|
81
|
+
// Asynchronously implement a generic for loop
|
|
82
|
+
function _for(test, update, body) {
|
|
83
|
+
var stage;
|
|
84
|
+
for (;;) {
|
|
85
|
+
var shouldContinue = test();
|
|
86
|
+
if (_isSettledPact(shouldContinue)) {
|
|
87
|
+
shouldContinue = shouldContinue.v;
|
|
88
|
+
}
|
|
89
|
+
if (!shouldContinue) {
|
|
90
|
+
return result;
|
|
91
|
+
}
|
|
92
|
+
if (shouldContinue.then) {
|
|
93
|
+
stage = 0;
|
|
94
|
+
break;
|
|
95
|
+
}
|
|
96
|
+
var result = body();
|
|
97
|
+
if (result && result.then) {
|
|
98
|
+
if (_isSettledPact(result)) {
|
|
99
|
+
result = result.s;
|
|
100
|
+
} else {
|
|
101
|
+
stage = 1;
|
|
102
|
+
break;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
if (update) {
|
|
106
|
+
var updateValue = update();
|
|
107
|
+
if (updateValue && updateValue.then && !_isSettledPact(updateValue)) {
|
|
108
|
+
stage = 2;
|
|
109
|
+
break;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
var pact = new _Pact();
|
|
114
|
+
var reject = _settle.bind(null, pact, 2);
|
|
115
|
+
(stage === 0 ? shouldContinue.then(_resumeAfterTest) : stage === 1 ? result.then(_resumeAfterBody) : updateValue.then(_resumeAfterUpdate)).then(void 0, reject);
|
|
116
|
+
return pact;
|
|
117
|
+
function _resumeAfterBody(value) {
|
|
118
|
+
result = value;
|
|
119
|
+
do {
|
|
120
|
+
if (update) {
|
|
121
|
+
updateValue = update();
|
|
122
|
+
if (updateValue && updateValue.then && !_isSettledPact(updateValue)) {
|
|
123
|
+
updateValue.then(_resumeAfterUpdate).then(void 0, reject);
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
shouldContinue = test();
|
|
128
|
+
if (!shouldContinue || (_isSettledPact(shouldContinue) && !shouldContinue.v)) {
|
|
129
|
+
_settle(pact, 1, result);
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
if (shouldContinue.then) {
|
|
133
|
+
shouldContinue.then(_resumeAfterTest).then(void 0, reject);
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
result = body();
|
|
137
|
+
if (_isSettledPact(result)) {
|
|
138
|
+
result = result.v;
|
|
139
|
+
}
|
|
140
|
+
} while (!result || !result.then);
|
|
141
|
+
result.then(_resumeAfterBody).then(void 0, reject);
|
|
142
|
+
}
|
|
143
|
+
function _resumeAfterTest(shouldContinue) {
|
|
144
|
+
if (shouldContinue) {
|
|
145
|
+
result = body();
|
|
146
|
+
if (result && result.then) {
|
|
147
|
+
result.then(_resumeAfterBody).then(void 0, reject);
|
|
148
|
+
} else {
|
|
149
|
+
_resumeAfterBody(result);
|
|
150
|
+
}
|
|
151
|
+
} else {
|
|
152
|
+
_settle(pact, 1, result);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
function _resumeAfterUpdate() {
|
|
156
|
+
if (shouldContinue = test()) {
|
|
157
|
+
if (shouldContinue.then) {
|
|
158
|
+
shouldContinue.then(_resumeAfterTest).then(void 0, reject);
|
|
159
|
+
} else {
|
|
160
|
+
_resumeAfterTest(shouldContinue);
|
|
161
|
+
}
|
|
162
|
+
} else {
|
|
163
|
+
_settle(pact, 1, result);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
// Asynchronously call a function and send errors to recovery continuation
|
|
169
|
+
function _catch(body, recover) {
|
|
170
|
+
try {
|
|
171
|
+
var result = body();
|
|
172
|
+
} catch(e) {
|
|
173
|
+
return recover(e);
|
|
174
|
+
}
|
|
175
|
+
if (result && result.then) {
|
|
176
|
+
return result.then(void 0, recover);
|
|
177
|
+
}
|
|
178
|
+
return result;
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
// Asynchronously await a promise and pass the result to a finally continuation
|
|
182
|
+
function _finallyRethrows(body, finalizer) {
|
|
183
|
+
try {
|
|
184
|
+
var result = body();
|
|
185
|
+
} catch (e) {
|
|
186
|
+
return finalizer(true, e);
|
|
187
|
+
}
|
|
188
|
+
if (result && result.then) {
|
|
189
|
+
return result.then(finalizer.bind(null, false), finalizer.bind(null, true));
|
|
190
|
+
}
|
|
191
|
+
return finalizer(false, result);
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
var ChatApi = /*#__PURE__*/function () {
|
|
195
|
+
function ChatApi(config) {
|
|
196
|
+
this.client = axios.create({
|
|
197
|
+
baseURL: config.baseUrl,
|
|
198
|
+
headers: {
|
|
199
|
+
Authorization: "Bearer " + config.token,
|
|
200
|
+
'Content-Type': 'application/json',
|
|
201
|
+
'x-requesting-client-id': config.client_id
|
|
202
|
+
}
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
var _proto = ChatApi.prototype;
|
|
206
|
+
_proto.healthCheck = function healthCheck() {
|
|
207
|
+
try {
|
|
208
|
+
var _this = this;
|
|
209
|
+
return Promise.resolve(_this.client.get('/api/health')).then(function (response) {
|
|
210
|
+
return response.data;
|
|
211
|
+
});
|
|
212
|
+
} catch (e) {
|
|
213
|
+
return Promise.reject(e);
|
|
214
|
+
}
|
|
215
|
+
};
|
|
216
|
+
_proto.listConversations = function listConversations(archived, clientIds) {
|
|
217
|
+
try {
|
|
218
|
+
var _this2 = this;
|
|
219
|
+
var params = {};
|
|
220
|
+
if (archived !== undefined) params.archived = String(archived);
|
|
221
|
+
if (clientIds) params.client_ids = clientIds;
|
|
222
|
+
return Promise.resolve(_this2.client.get('/api/chat/conversations', {
|
|
223
|
+
params: params
|
|
224
|
+
})).then(function (response) {
|
|
225
|
+
return response.data;
|
|
226
|
+
});
|
|
227
|
+
} catch (e) {
|
|
228
|
+
return Promise.reject(e);
|
|
229
|
+
}
|
|
230
|
+
};
|
|
231
|
+
_proto.deleteConversation = function deleteConversation(conversationUid) {
|
|
232
|
+
try {
|
|
233
|
+
var _this3 = this;
|
|
234
|
+
return Promise.resolve(_this3.client["delete"]("/api/chat/conversations/" + conversationUid + "/delete")).then(function (response) {
|
|
235
|
+
return response.data;
|
|
236
|
+
});
|
|
237
|
+
} catch (e) {
|
|
238
|
+
return Promise.reject(e);
|
|
239
|
+
}
|
|
240
|
+
};
|
|
241
|
+
_proto.archiveConversation = function archiveConversation(conversationUid) {
|
|
242
|
+
try {
|
|
243
|
+
var _this4 = this;
|
|
244
|
+
return Promise.resolve(_this4.client.post("/api/chat/conversations/" + conversationUid + "/archive")).then(function (response) {
|
|
245
|
+
return response.data;
|
|
246
|
+
});
|
|
247
|
+
} catch (e) {
|
|
248
|
+
return Promise.reject(e);
|
|
249
|
+
}
|
|
250
|
+
};
|
|
251
|
+
_proto.unarchiveConversation = function unarchiveConversation(conversationUid) {
|
|
252
|
+
try {
|
|
253
|
+
var _this5 = this;
|
|
254
|
+
return Promise.resolve(_this5.client.post("/api/chat/conversations/" + conversationUid + "/unarchive")).then(function (response) {
|
|
255
|
+
return response.data;
|
|
256
|
+
});
|
|
257
|
+
} catch (e) {
|
|
258
|
+
return Promise.reject(e);
|
|
259
|
+
}
|
|
260
|
+
};
|
|
261
|
+
_proto.getConversationDetails = function getConversationDetails(conversationUid) {
|
|
262
|
+
try {
|
|
263
|
+
var _this6 = this;
|
|
264
|
+
return Promise.resolve(_this6.client.get("/api/chat/conversations/" + conversationUid + "/details")).then(function (response) {
|
|
265
|
+
return response.data;
|
|
266
|
+
});
|
|
267
|
+
} catch (e) {
|
|
268
|
+
return Promise.reject(e);
|
|
269
|
+
}
|
|
270
|
+
};
|
|
271
|
+
_proto.getConversationWithReceiver = function getConversationWithReceiver(receiverId) {
|
|
272
|
+
try {
|
|
273
|
+
var _this7 = this;
|
|
274
|
+
return Promise.resolve(_this7.client.get("/api/chat/conversations/with/" + receiverId)).then(function (response) {
|
|
275
|
+
return response.data;
|
|
276
|
+
});
|
|
277
|
+
} catch (e) {
|
|
278
|
+
return Promise.reject(e);
|
|
279
|
+
}
|
|
280
|
+
};
|
|
281
|
+
_proto.searchConversation = function searchConversation(conversationUid, term) {
|
|
282
|
+
try {
|
|
283
|
+
var _this8 = this;
|
|
284
|
+
return Promise.resolve(_this8.client.get("/api/chat/conversations/" + conversationUid + "/search", {
|
|
285
|
+
params: {
|
|
286
|
+
term: term
|
|
287
|
+
}
|
|
288
|
+
})).then(function (response) {
|
|
289
|
+
return response.data;
|
|
290
|
+
});
|
|
291
|
+
} catch (e) {
|
|
292
|
+
return Promise.reject(e);
|
|
293
|
+
}
|
|
294
|
+
};
|
|
295
|
+
_proto.getMessages = function getMessages(conversationUid, page, pageSize) {
|
|
296
|
+
if (page === void 0) {
|
|
297
|
+
page = 1;
|
|
298
|
+
}
|
|
299
|
+
if (pageSize === void 0) {
|
|
300
|
+
pageSize = 20;
|
|
301
|
+
}
|
|
302
|
+
try {
|
|
303
|
+
var _this9 = this;
|
|
304
|
+
return Promise.resolve(_this9.client.get("/api/messages/" + conversationUid + "/list", {
|
|
305
|
+
params: {
|
|
306
|
+
page: page,
|
|
307
|
+
page_size: pageSize
|
|
308
|
+
}
|
|
309
|
+
})).then(function (response) {
|
|
310
|
+
return response.data;
|
|
311
|
+
});
|
|
312
|
+
} catch (e) {
|
|
313
|
+
return Promise.reject(e);
|
|
314
|
+
}
|
|
315
|
+
};
|
|
316
|
+
_proto.markMessageAsRead = function markMessageAsRead(messageId) {
|
|
317
|
+
try {
|
|
318
|
+
var _this0 = this;
|
|
319
|
+
return Promise.resolve(_this0.client.post("/api/messages/" + messageId + "/read")).then(function (response) {
|
|
320
|
+
return response.data;
|
|
321
|
+
});
|
|
322
|
+
} catch (e) {
|
|
323
|
+
return Promise.reject(e);
|
|
324
|
+
}
|
|
325
|
+
};
|
|
326
|
+
_proto.sendMessage = function sendMessage(message) {
|
|
327
|
+
try {
|
|
328
|
+
var _this1 = this;
|
|
329
|
+
return Promise.resolve(_this1.client.post('/api/messages/send-message', message)).then(function (response) {
|
|
330
|
+
return response.data;
|
|
331
|
+
});
|
|
332
|
+
} catch (e) {
|
|
333
|
+
return Promise.reject(e);
|
|
334
|
+
}
|
|
335
|
+
};
|
|
336
|
+
_proto.markConversationAsRead = function markConversationAsRead(conversationUid) {
|
|
337
|
+
try {
|
|
338
|
+
var _this10 = this;
|
|
339
|
+
return Promise.resolve(_this10.client.post("/api/messages/conversation/" + conversationUid + "/read")).then(function (response) {
|
|
340
|
+
return response.data;
|
|
341
|
+
});
|
|
342
|
+
} catch (e) {
|
|
343
|
+
return Promise.reject(e);
|
|
344
|
+
}
|
|
345
|
+
};
|
|
346
|
+
_proto.updateMessage = function updateMessage(messageId, update) {
|
|
347
|
+
try {
|
|
348
|
+
var _this11 = this;
|
|
349
|
+
return Promise.resolve(_this11.client.put("/api/messages/" + messageId, update)).then(function (response) {
|
|
350
|
+
return response.data;
|
|
351
|
+
});
|
|
352
|
+
} catch (e) {
|
|
353
|
+
return Promise.reject(e);
|
|
354
|
+
}
|
|
355
|
+
};
|
|
356
|
+
_proto.deleteMessage = function deleteMessage(messageId) {
|
|
357
|
+
try {
|
|
358
|
+
var _this12 = this;
|
|
359
|
+
return Promise.resolve(_this12.client["delete"]("/api/messages/" + messageId)).then(function (response) {
|
|
360
|
+
return response.data;
|
|
361
|
+
});
|
|
362
|
+
} catch (e) {
|
|
363
|
+
return Promise.reject(e);
|
|
364
|
+
}
|
|
365
|
+
};
|
|
366
|
+
_proto.uploadFile = function uploadFile(file) {
|
|
367
|
+
try {
|
|
368
|
+
var _this13 = this;
|
|
369
|
+
var formData = new FormData();
|
|
370
|
+
formData.append('file', file);
|
|
371
|
+
var config = {
|
|
372
|
+
headers: {
|
|
373
|
+
'Content-Type': 'multipart/form-data'
|
|
374
|
+
}
|
|
375
|
+
};
|
|
376
|
+
return Promise.resolve(_this13.client.post('/api/files/upload', formData, config)).then(function (response) {
|
|
377
|
+
return response.data;
|
|
378
|
+
});
|
|
379
|
+
} catch (e) {
|
|
380
|
+
return Promise.reject(e);
|
|
381
|
+
}
|
|
382
|
+
};
|
|
383
|
+
_proto.banClient = function banClient(request) {
|
|
384
|
+
try {
|
|
385
|
+
var _this14 = this;
|
|
386
|
+
return Promise.resolve(_this14.client.post('/api/bans/client', request)).then(function (response) {
|
|
387
|
+
return response.data;
|
|
388
|
+
});
|
|
389
|
+
} catch (e) {
|
|
390
|
+
return Promise.reject(e);
|
|
391
|
+
}
|
|
392
|
+
};
|
|
393
|
+
_proto.unbanClient = function unbanClient(request) {
|
|
394
|
+
try {
|
|
395
|
+
var _this15 = this;
|
|
396
|
+
return Promise.resolve(_this15.client["delete"]('/api/bans/client', {
|
|
397
|
+
data: request
|
|
398
|
+
})).then(function (response) {
|
|
399
|
+
return response.data;
|
|
400
|
+
});
|
|
401
|
+
} catch (e) {
|
|
402
|
+
return Promise.reject(e);
|
|
403
|
+
}
|
|
404
|
+
};
|
|
405
|
+
_proto.adminBanClient = function adminBanClient(request) {
|
|
406
|
+
try {
|
|
407
|
+
var _this16 = this;
|
|
408
|
+
return Promise.resolve(_this16.client.post('/api/bans/admin', request)).then(function (response) {
|
|
409
|
+
return response.data;
|
|
410
|
+
});
|
|
411
|
+
} catch (e) {
|
|
412
|
+
return Promise.reject(e);
|
|
413
|
+
}
|
|
414
|
+
};
|
|
415
|
+
_proto.adminUnbanClient = function adminUnbanClient(request) {
|
|
416
|
+
try {
|
|
417
|
+
var _this17 = this;
|
|
418
|
+
return Promise.resolve(_this17.client["delete"]('/api/bans/admin', {
|
|
419
|
+
data: request
|
|
420
|
+
})).then(function (response) {
|
|
421
|
+
return response.data;
|
|
422
|
+
});
|
|
423
|
+
} catch (e) {
|
|
424
|
+
return Promise.reject(e);
|
|
425
|
+
}
|
|
426
|
+
};
|
|
427
|
+
_proto.checkBanStatus = function checkBanStatus(clientId) {
|
|
428
|
+
try {
|
|
429
|
+
var _this18 = this;
|
|
430
|
+
return Promise.resolve(_this18.client.get("/api/bans/status/" + clientId)).then(function (response) {
|
|
431
|
+
return response.data;
|
|
432
|
+
});
|
|
433
|
+
} catch (e) {
|
|
434
|
+
return Promise.reject(e);
|
|
435
|
+
}
|
|
436
|
+
};
|
|
437
|
+
_proto.getClientProfile = function getClientProfile() {
|
|
438
|
+
try {
|
|
439
|
+
var _this19 = this;
|
|
440
|
+
return Promise.resolve(_this19.client.get('/api/clients/profile')).then(function (response) {
|
|
441
|
+
return response.data;
|
|
442
|
+
});
|
|
443
|
+
} catch (e) {
|
|
444
|
+
return Promise.reject(e);
|
|
445
|
+
}
|
|
446
|
+
};
|
|
447
|
+
_proto.getClientPreferences = function getClientPreferences() {
|
|
448
|
+
try {
|
|
449
|
+
var _this20 = this;
|
|
450
|
+
return Promise.resolve(_this20.client.get('/api/clients/preferences')).then(function (response) {
|
|
451
|
+
return response.data;
|
|
452
|
+
});
|
|
453
|
+
} catch (e) {
|
|
454
|
+
return Promise.reject(e);
|
|
455
|
+
}
|
|
456
|
+
};
|
|
457
|
+
_proto.updateClientPreferences = function updateClientPreferences(request) {
|
|
458
|
+
try {
|
|
459
|
+
var _this21 = this;
|
|
460
|
+
return Promise.resolve(_this21.client.put('/api/clients/preferences', request)).then(function (response) {
|
|
461
|
+
return response.data;
|
|
462
|
+
});
|
|
463
|
+
} catch (e) {
|
|
464
|
+
return Promise.reject(e);
|
|
465
|
+
}
|
|
466
|
+
};
|
|
467
|
+
return ChatApi;
|
|
468
|
+
}();
|
|
469
|
+
|
|
470
|
+
function _extends() {
|
|
471
|
+
return _extends = Object.assign ? Object.assign.bind() : function (n) {
|
|
472
|
+
for (var e = 1; e < arguments.length; e++) {
|
|
473
|
+
var t = arguments[e];
|
|
474
|
+
for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]);
|
|
475
|
+
}
|
|
476
|
+
return n;
|
|
477
|
+
}, _extends.apply(null, arguments);
|
|
478
|
+
}
|
|
479
|
+
|
|
480
|
+
(function (ConnectionType) {
|
|
481
|
+
ConnectionType["WebSocket"] = "websocket";
|
|
482
|
+
ConnectionType["LongPolling"] = "longpolling";
|
|
483
|
+
})(exports.ConnectionType || (exports.ConnectionType = {}));
|
|
484
|
+
(function (ConnectionStatus) {
|
|
485
|
+
ConnectionStatus["Connected"] = "connected";
|
|
486
|
+
ConnectionStatus["Connecting"] = "connecting";
|
|
487
|
+
ConnectionStatus["Disconnected"] = "disconnected";
|
|
488
|
+
ConnectionStatus["Error"] = "error";
|
|
489
|
+
})(exports.ConnectionStatus || (exports.ConnectionStatus = {}));
|
|
490
|
+
(function (EventType) {
|
|
491
|
+
EventType["MessageSent"] = "message_sent";
|
|
492
|
+
EventType["MessageEdited"] = "message_edited";
|
|
493
|
+
EventType["MessageDeleted"] = "message_deleted";
|
|
494
|
+
EventType["MessageReceived"] = "message_received";
|
|
495
|
+
EventType["MessageRead"] = "message_read";
|
|
496
|
+
EventType["ConversationRead"] = "conversation_read";
|
|
497
|
+
})(exports.EventType || (exports.EventType = {}));
|
|
498
|
+
|
|
499
|
+
(function (LogLevel) {
|
|
500
|
+
LogLevel[LogLevel["DEBUG"] = 0] = "DEBUG";
|
|
501
|
+
LogLevel[LogLevel["INFO"] = 1] = "INFO";
|
|
502
|
+
LogLevel[LogLevel["WARN"] = 2] = "WARN";
|
|
503
|
+
LogLevel[LogLevel["ERROR"] = 3] = "ERROR";
|
|
504
|
+
LogLevel[LogLevel["NONE"] = 4] = "NONE";
|
|
505
|
+
})(exports.LogLevel || (exports.LogLevel = {}));
|
|
506
|
+
var Logger = /*#__PURE__*/function () {
|
|
507
|
+
function Logger(config) {
|
|
508
|
+
if (config === void 0) {
|
|
509
|
+
config = {};
|
|
510
|
+
}
|
|
511
|
+
this.config = _extends({
|
|
512
|
+
enabled: false,
|
|
513
|
+
level: exports.LogLevel.INFO,
|
|
514
|
+
prefix: '[ChatWS]',
|
|
515
|
+
timestamp: true,
|
|
516
|
+
includeData: true,
|
|
517
|
+
prettyPrint: true
|
|
518
|
+
}, config);
|
|
519
|
+
}
|
|
520
|
+
var _proto = Logger.prototype;
|
|
521
|
+
_proto.shouldLog = function shouldLog(level) {
|
|
522
|
+
return this.config.enabled && level >= this.config.level;
|
|
523
|
+
};
|
|
524
|
+
_proto.formatMessage = function formatMessage(level, message) {
|
|
525
|
+
var parts = [];
|
|
526
|
+
if (this.config.timestamp) {
|
|
527
|
+
parts.push("[" + new Date().toISOString() + "]");
|
|
528
|
+
}
|
|
529
|
+
if (this.config.prefix) {
|
|
530
|
+
parts.push(this.config.prefix);
|
|
531
|
+
}
|
|
532
|
+
parts.push("[" + level + "]");
|
|
533
|
+
parts.push(message);
|
|
534
|
+
return parts.join(' ');
|
|
535
|
+
};
|
|
536
|
+
_proto.formatData = function formatData(data) {
|
|
537
|
+
if (!this.config.includeData || !data) return undefined;
|
|
538
|
+
try {
|
|
539
|
+
var cloned = JSON.parse(JSON.stringify(data));
|
|
540
|
+
this.maskSensitiveData(cloned);
|
|
541
|
+
return this.config.prettyPrint ? cloned : JSON.stringify(cloned);
|
|
542
|
+
} catch (err) {
|
|
543
|
+
var _data$constructor;
|
|
544
|
+
return "[Object: " + ((data === null || data === void 0 ? void 0 : (_data$constructor = data.constructor) === null || _data$constructor === void 0 ? void 0 : _data$constructor.name) || typeof data) + "]";
|
|
545
|
+
}
|
|
546
|
+
};
|
|
547
|
+
_proto.maskSensitiveData = function maskSensitiveData(obj) {
|
|
548
|
+
var _this = this;
|
|
549
|
+
if (!obj || typeof obj !== 'object') return;
|
|
550
|
+
var sensitiveKeys = ['token', 'password', 'auth', 'authorization', 'api_key', 'apiKey', 'secret'];
|
|
551
|
+
var _loop = function _loop() {
|
|
552
|
+
var lowerKey = key.toLowerCase();
|
|
553
|
+
if (sensitiveKeys.some(function (sensitive) {
|
|
554
|
+
return lowerKey.includes(sensitive);
|
|
555
|
+
})) {
|
|
556
|
+
obj[key] = '***MASKED***';
|
|
557
|
+
} else if (typeof obj[key] === 'object') {
|
|
558
|
+
_this.maskSensitiveData(obj[key]);
|
|
559
|
+
}
|
|
560
|
+
};
|
|
561
|
+
for (var key in obj) {
|
|
562
|
+
_loop();
|
|
563
|
+
}
|
|
564
|
+
};
|
|
565
|
+
_proto.debug = function debug(message, data) {
|
|
566
|
+
if (!this.shouldLog(exports.LogLevel.DEBUG)) return;
|
|
567
|
+
var formatted = this.formatMessage('DEBUG', message);
|
|
568
|
+
var formattedData = this.formatData(data);
|
|
569
|
+
if (formattedData !== undefined) {
|
|
570
|
+
console.log(formatted, formattedData);
|
|
571
|
+
} else {
|
|
572
|
+
console.log(formatted);
|
|
573
|
+
}
|
|
574
|
+
};
|
|
575
|
+
_proto.info = function info(message, data) {
|
|
576
|
+
if (!this.shouldLog(exports.LogLevel.INFO)) return;
|
|
577
|
+
var formatted = this.formatMessage('INFO', message);
|
|
578
|
+
var formattedData = this.formatData(data);
|
|
579
|
+
if (formattedData !== undefined) {
|
|
580
|
+
console.info(formatted, formattedData);
|
|
581
|
+
} else {
|
|
582
|
+
console.info(formatted);
|
|
583
|
+
}
|
|
584
|
+
};
|
|
585
|
+
_proto.warn = function warn(message, data) {
|
|
586
|
+
if (!this.shouldLog(exports.LogLevel.WARN)) return;
|
|
587
|
+
var formatted = this.formatMessage('WARN', message);
|
|
588
|
+
var formattedData = this.formatData(data);
|
|
589
|
+
if (formattedData !== undefined) {
|
|
590
|
+
console.warn(formatted, formattedData);
|
|
591
|
+
} else {
|
|
592
|
+
console.warn(formatted);
|
|
593
|
+
}
|
|
594
|
+
};
|
|
595
|
+
_proto.error = function error(message, data) {
|
|
596
|
+
if (!this.shouldLog(exports.LogLevel.ERROR)) return;
|
|
597
|
+
var formatted = this.formatMessage('ERROR', message);
|
|
598
|
+
var formattedData = this.formatData(data);
|
|
599
|
+
if (formattedData !== undefined) {
|
|
600
|
+
console.error(formatted, formattedData);
|
|
601
|
+
} else {
|
|
602
|
+
console.error(formatted);
|
|
603
|
+
}
|
|
604
|
+
};
|
|
605
|
+
_proto.group = function group(label) {
|
|
606
|
+
if (!this.config.enabled) return;
|
|
607
|
+
console.group(this.formatMessage('GROUP', label));
|
|
608
|
+
};
|
|
609
|
+
_proto.groupEnd = function groupEnd() {
|
|
610
|
+
if (!this.config.enabled) return;
|
|
611
|
+
console.groupEnd();
|
|
612
|
+
};
|
|
613
|
+
_proto.time = function time(label) {
|
|
614
|
+
if (!this.config.enabled) return;
|
|
615
|
+
console.time(this.config.prefix + " " + label);
|
|
616
|
+
};
|
|
617
|
+
_proto.timeEnd = function timeEnd(label) {
|
|
618
|
+
if (!this.config.enabled) return;
|
|
619
|
+
console.timeEnd(this.config.prefix + " " + label);
|
|
620
|
+
};
|
|
621
|
+
_proto.updateConfig = function updateConfig(config) {
|
|
622
|
+
this.config = _extends({}, this.config, config);
|
|
623
|
+
};
|
|
624
|
+
_proto.getConfig = function getConfig() {
|
|
625
|
+
return _extends({}, this.config);
|
|
626
|
+
};
|
|
627
|
+
return Logger;
|
|
628
|
+
}();
|
|
629
|
+
|
|
630
|
+
var DEFAULT_CONFIG = {
|
|
631
|
+
type: exports.ConnectionType.WebSocket,
|
|
632
|
+
autoReconnect: true,
|
|
633
|
+
reconnectAttempts: 5,
|
|
634
|
+
reconnectDelay: 3000,
|
|
635
|
+
logging: {
|
|
636
|
+
enabled: false,
|
|
637
|
+
level: exports.LogLevel.INFO
|
|
638
|
+
},
|
|
639
|
+
onlyLongpolling: false,
|
|
640
|
+
degradeWsOnFailure: true,
|
|
641
|
+
wsFailureThreshold: 3,
|
|
642
|
+
wsDegradeTTLms: 24 * 60 * 60 * 1000,
|
|
643
|
+
forceWebSocket: false
|
|
644
|
+
};
|
|
645
|
+
var QUEUE_KEY = 'chat_queue';
|
|
646
|
+
var ConnectionManager = /*#__PURE__*/function () {
|
|
647
|
+
function ConnectionManager(auth, api, options) {
|
|
648
|
+
var _this$cfg$logging;
|
|
649
|
+
if (options === void 0) {
|
|
650
|
+
options = {};
|
|
651
|
+
}
|
|
652
|
+
this.socket = null;
|
|
653
|
+
this.status = exports.ConnectionStatus.Disconnected;
|
|
654
|
+
this.eventListeners = new Map();
|
|
655
|
+
this.statusListeners = [];
|
|
656
|
+
this.errorListeners = [];
|
|
657
|
+
this.queue = [];
|
|
658
|
+
this.processingQueue = false;
|
|
659
|
+
this.connecting = false;
|
|
660
|
+
this.reconnectCount = 0;
|
|
661
|
+
this.wsFailCount = 0;
|
|
662
|
+
this.isDegraded = false;
|
|
663
|
+
this.auth = auth;
|
|
664
|
+
this.api = api;
|
|
665
|
+
this.cfg = _extends({}, DEFAULT_CONFIG, options);
|
|
666
|
+
this.logger = new Logger(this.cfg.logging || {});
|
|
667
|
+
this.logger.info('ConnectionManager initialized', {
|
|
668
|
+
config: {
|
|
669
|
+
type: this.cfg.type,
|
|
670
|
+
autoReconnect: this.cfg.autoReconnect,
|
|
671
|
+
reconnectAttempts: this.cfg.reconnectAttempts,
|
|
672
|
+
reconnectDelay: this.cfg.reconnectDelay,
|
|
673
|
+
loggingEnabled: (_this$cfg$logging = this.cfg.logging) === null || _this$cfg$logging === void 0 ? void 0 : _this$cfg$logging.enabled
|
|
674
|
+
}
|
|
675
|
+
});
|
|
676
|
+
if (typeof window !== 'undefined') {
|
|
677
|
+
var saved = sessionStorage.getItem(QUEUE_KEY);
|
|
678
|
+
if (saved) {
|
|
679
|
+
try {
|
|
680
|
+
var _this$queue;
|
|
681
|
+
var parsed = JSON.parse(saved);
|
|
682
|
+
(_this$queue = this.queue).push.apply(_this$queue, parsed);
|
|
683
|
+
this.logger.debug('Loaded queued messages from session storage', {
|
|
684
|
+
count: parsed.length
|
|
685
|
+
});
|
|
686
|
+
} catch (err) {
|
|
687
|
+
this.logger.warn('Failed to parse queued messages from session storage', err);
|
|
688
|
+
}
|
|
689
|
+
}
|
|
690
|
+
var degradeUntil = this.getDegradeUntil();
|
|
691
|
+
if (degradeUntil && Date.now() < degradeUntil && !this.cfg.forceWebSocket) {
|
|
692
|
+
this.isDegraded = true;
|
|
693
|
+
this.logger.info('WebSocket degraded mode active from persisted state', {
|
|
694
|
+
degradeUntil: degradeUntil
|
|
695
|
+
});
|
|
696
|
+
} else if (degradeUntil && Date.now() >= degradeUntil) {
|
|
697
|
+
this.clearDegradation();
|
|
698
|
+
}
|
|
699
|
+
this.wsFailCount = this.getFailCount();
|
|
700
|
+
}
|
|
701
|
+
}
|
|
702
|
+
ConnectionManager.getInstance = function getInstance(auth, api, options) {
|
|
703
|
+
if (options === void 0) {
|
|
704
|
+
options = {};
|
|
705
|
+
}
|
|
706
|
+
if (!ConnectionManager.instance) {
|
|
707
|
+
ConnectionManager.instance = new ConnectionManager(auth, api, options);
|
|
708
|
+
}
|
|
709
|
+
return ConnectionManager.instance;
|
|
710
|
+
};
|
|
711
|
+
ConnectionManager.resetInstance = function resetInstance() {
|
|
712
|
+
if (ConnectionManager.instance) {
|
|
713
|
+
ConnectionManager.instance.disconnect();
|
|
714
|
+
ConnectionManager.instance = null;
|
|
715
|
+
}
|
|
716
|
+
};
|
|
717
|
+
var _proto = ConnectionManager.prototype;
|
|
718
|
+
_proto.connect = function connect() {
|
|
719
|
+
if (this.status === exports.ConnectionStatus.Connected || this.status === exports.ConnectionStatus.Connecting || this.connecting) {
|
|
720
|
+
this.logger.debug('Connect called but already connected/connecting', {
|
|
721
|
+
status: this.status,
|
|
722
|
+
connecting: this.connecting
|
|
723
|
+
});
|
|
724
|
+
return;
|
|
725
|
+
}
|
|
726
|
+
this.logger.info('Initiating connection', {
|
|
727
|
+
socketUrl: this.auth.socketBaseUrl
|
|
728
|
+
});
|
|
729
|
+
this.connecting = true;
|
|
730
|
+
this.setStatus(exports.ConnectionStatus.Connecting);
|
|
731
|
+
this.connectWS();
|
|
732
|
+
};
|
|
733
|
+
_proto.disconnect = function disconnect() {
|
|
734
|
+
var _this$socket;
|
|
735
|
+
this.logger.info('Disconnecting from websocket');
|
|
736
|
+
this.clearTimers();
|
|
737
|
+
(_this$socket = this.socket) === null || _this$socket === void 0 ? void 0 : _this$socket.disconnect();
|
|
738
|
+
this.socket = null;
|
|
739
|
+
this.connecting = false;
|
|
740
|
+
this.setStatus(exports.ConnectionStatus.Disconnected);
|
|
741
|
+
this.logger.info('Disconnected successfully');
|
|
742
|
+
};
|
|
743
|
+
_proto.getStatus = function getStatus() {
|
|
744
|
+
return this.status;
|
|
745
|
+
};
|
|
746
|
+
_proto.queueMessage = function queueMessage(msg, maxAttempts) {
|
|
747
|
+
if (maxAttempts === void 0) {
|
|
748
|
+
maxAttempts = 3;
|
|
749
|
+
}
|
|
750
|
+
var id = typeof crypto !== 'undefined' && crypto.randomUUID ? crypto.randomUUID() : (Date.now() + Math.random()).toString(36);
|
|
751
|
+
var queuedMessage = {
|
|
752
|
+
id: id,
|
|
753
|
+
message: msg,
|
|
754
|
+
attempts: 0,
|
|
755
|
+
maxAttempts: maxAttempts,
|
|
756
|
+
timestamp: Date.now()
|
|
757
|
+
};
|
|
758
|
+
this.logger.debug('Queueing message', {
|
|
759
|
+
messageId: id,
|
|
760
|
+
receiver: msg.receiver_client_id,
|
|
761
|
+
hasContent: !!msg.content,
|
|
762
|
+
hasAttachments: !!(msg.attachments && msg.attachments.length > 0),
|
|
763
|
+
maxAttempts: maxAttempts
|
|
764
|
+
});
|
|
765
|
+
this.queue.push(queuedMessage);
|
|
766
|
+
this.saveQueue();
|
|
767
|
+
this.processQueue();
|
|
768
|
+
return id;
|
|
769
|
+
};
|
|
770
|
+
_proto.on = function on(evt, cb) {
|
|
771
|
+
this.add(this.eventListeners, evt, cb);
|
|
772
|
+
};
|
|
773
|
+
_proto.off = function off(evt, cb) {
|
|
774
|
+
this.remove(this.eventListeners, evt, cb);
|
|
775
|
+
};
|
|
776
|
+
_proto.emit = function emit(evt) {
|
|
777
|
+
var _this$socket2;
|
|
778
|
+
for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
|
|
779
|
+
args[_key - 1] = arguments[_key];
|
|
780
|
+
}
|
|
781
|
+
this.logger.debug('Emitting event', {
|
|
782
|
+
event: evt,
|
|
783
|
+
args: args.length > 0 ? args : undefined
|
|
784
|
+
});
|
|
785
|
+
(_this$socket2 = this.socket).emit.apply(_this$socket2, [evt].concat(args));
|
|
786
|
+
};
|
|
787
|
+
_proto.onStatusChange = function onStatusChange(cb) {
|
|
788
|
+
this.statusListeners.push(cb);
|
|
789
|
+
};
|
|
790
|
+
_proto.offStatusChange = function offStatusChange(cb) {
|
|
791
|
+
var i = this.statusListeners.indexOf(cb);
|
|
792
|
+
if (i !== -1) this.statusListeners.splice(i, 1);
|
|
793
|
+
};
|
|
794
|
+
_proto.onError = function onError(cb) {
|
|
795
|
+
this.errorListeners.push(cb);
|
|
796
|
+
};
|
|
797
|
+
_proto.offError = function offError(cb) {
|
|
798
|
+
var i = this.errorListeners.indexOf(cb);
|
|
799
|
+
if (i !== -1) this.errorListeners.splice(i, 1);
|
|
800
|
+
};
|
|
801
|
+
_proto.updateLogging = function updateLogging(config) {
|
|
802
|
+
this.logger.updateConfig(config);
|
|
803
|
+
this.logger.info('Logging configuration updated', config);
|
|
804
|
+
};
|
|
805
|
+
_proto.getLoggingConfig = function getLoggingConfig() {
|
|
806
|
+
return this.logger.getConfig();
|
|
807
|
+
};
|
|
808
|
+
_proto.connectWS = function connectWS() {
|
|
809
|
+
var _this = this;
|
|
810
|
+
try {
|
|
811
|
+
this.logger.debug('Starting WebSocket connection', {
|
|
812
|
+
url: this.auth.socketBaseUrl,
|
|
813
|
+
hasExistingSocket: !!this.socket,
|
|
814
|
+
degraded: this.isDegraded
|
|
815
|
+
});
|
|
816
|
+
if (this.socket) {
|
|
817
|
+
this.logger.debug('Cleaning up existing socket connection');
|
|
818
|
+
this.socket.removeAllListeners();
|
|
819
|
+
this.socket.disconnect();
|
|
820
|
+
}
|
|
821
|
+
var socketOpts = this.buildSocketOpts();
|
|
822
|
+
this.logger.debug('Creating socket with options', socketOpts);
|
|
823
|
+
this.socket = socket_ioClient.io(this.auth.socketBaseUrl, socketOpts);
|
|
824
|
+
try {
|
|
825
|
+
var manager = this.socket.io;
|
|
826
|
+
var engine = manager === null || manager === void 0 ? void 0 : manager.engine;
|
|
827
|
+
if (engine && typeof engine.on === 'function') {
|
|
828
|
+
engine.on('upgrade', function (transport) {
|
|
829
|
+
var name = (transport === null || transport === void 0 ? void 0 : transport.name) || transport;
|
|
830
|
+
_this.logger.info('Engine.io upgrade success', {
|
|
831
|
+
transport: name
|
|
832
|
+
});
|
|
833
|
+
if (name === 'websocket') {
|
|
834
|
+
_this.resetWsFailures();
|
|
835
|
+
if (_this.isDegraded) {
|
|
836
|
+
_this.logger.info('Exiting degraded mode after successful websocket upgrade');
|
|
837
|
+
_this.clearDegradation();
|
|
838
|
+
_this.isDegraded = false;
|
|
839
|
+
}
|
|
840
|
+
}
|
|
841
|
+
});
|
|
842
|
+
engine.on('upgradeError', function (err) {
|
|
843
|
+
_this.logger.warn('Engine.io upgrade error', {
|
|
844
|
+
error: (err === null || err === void 0 ? void 0 : err.message) || err
|
|
845
|
+
});
|
|
846
|
+
_this.onWsFailure();
|
|
847
|
+
});
|
|
848
|
+
}
|
|
849
|
+
} catch (wiringErr) {
|
|
850
|
+
this.logger.debug('Unable to wire engine.io upgrade listeners', {
|
|
851
|
+
error: (wiringErr === null || wiringErr === void 0 ? void 0 : wiringErr.message) || wiringErr
|
|
852
|
+
});
|
|
853
|
+
}
|
|
854
|
+
this.socket.on('connect', function () {
|
|
855
|
+
_this.logger.info('WebSocket connected successfully', {
|
|
856
|
+
socketId: _this.socket.id,
|
|
857
|
+
reconnectCount: _this.reconnectCount
|
|
858
|
+
});
|
|
859
|
+
_this.connecting = false;
|
|
860
|
+
_this.reconnectCount = 0;
|
|
861
|
+
_this.setStatus(exports.ConnectionStatus.Connected);
|
|
862
|
+
_this.processQueue();
|
|
863
|
+
});
|
|
864
|
+
this.socket.on('connect_error', function (err) {
|
|
865
|
+
_this.logger.error('WebSocket connection error', {
|
|
866
|
+
error: err.message,
|
|
867
|
+
type: err.type || 'unknown',
|
|
868
|
+
reconnectCount: _this.reconnectCount
|
|
869
|
+
});
|
|
870
|
+
_this.connecting = false;
|
|
871
|
+
if (!_this.isDegraded && !_this.cfg.onlyLongpolling && !_this.cfg.forceWebSocket) {
|
|
872
|
+
_this.onWsFailure();
|
|
873
|
+
}
|
|
874
|
+
_this.handleConnError(err);
|
|
875
|
+
});
|
|
876
|
+
this.socket.on('disconnect', function (reason) {
|
|
877
|
+
_this.logger.info('WebSocket disconnected', {
|
|
878
|
+
reason: reason,
|
|
879
|
+
willReconnect: _this.cfg.autoReconnect
|
|
880
|
+
});
|
|
881
|
+
_this.connecting = false;
|
|
882
|
+
_this.setStatus(exports.ConnectionStatus.Disconnected);
|
|
883
|
+
_this.scheduleReconnect();
|
|
884
|
+
});
|
|
885
|
+
if (this.logger.getConfig().level <= exports.LogLevel.DEBUG) {
|
|
886
|
+
this.socket.on('ping', function () {
|
|
887
|
+
_this.logger.debug('Socket.io ping sent');
|
|
888
|
+
});
|
|
889
|
+
this.socket.on('pong', function (latency) {
|
|
890
|
+
_this.logger.debug('Socket.io pong received', {
|
|
891
|
+
latency: latency
|
|
892
|
+
});
|
|
893
|
+
});
|
|
894
|
+
}
|
|
895
|
+
Object.values(exports.EventType).forEach(function (evt) {
|
|
896
|
+
_this.socket.on(evt, function (data) {
|
|
897
|
+
_this.logger.debug('Received realtime event', {
|
|
898
|
+
event: evt,
|
|
899
|
+
data: data
|
|
900
|
+
});
|
|
901
|
+
_this.handleEvent({
|
|
902
|
+
type: evt,
|
|
903
|
+
data: data
|
|
904
|
+
});
|
|
905
|
+
});
|
|
906
|
+
});
|
|
907
|
+
this.logger.debug('WebSocket event listeners registered', {
|
|
908
|
+
events: Object.values(exports.EventType)
|
|
909
|
+
});
|
|
910
|
+
} catch (err) {
|
|
911
|
+
this.logger.error('WebSocket initialization failed', err);
|
|
912
|
+
this.connecting = false;
|
|
913
|
+
this.handleConnError(err);
|
|
914
|
+
}
|
|
915
|
+
};
|
|
916
|
+
_proto.buildSocketOpts = function buildSocketOpts() {
|
|
917
|
+
var isBrowser = typeof window !== 'undefined';
|
|
918
|
+
var headers = _extends({}, this.cfg.headers, {
|
|
919
|
+
Authorization: "Bearer " + this.auth.token
|
|
920
|
+
});
|
|
921
|
+
var transports = ['websocket'];
|
|
922
|
+
var degraded = this.isDegraded && !this.cfg.forceWebSocket;
|
|
923
|
+
if (this.cfg.onlyLongpolling || degraded) {
|
|
924
|
+
transports = ['polling'];
|
|
925
|
+
} else if (this.cfg.type === exports.ConnectionType.LongPolling) {
|
|
926
|
+
transports = ['polling', 'websocket'];
|
|
927
|
+
} else {
|
|
928
|
+
transports = ['websocket', 'polling'];
|
|
929
|
+
}
|
|
930
|
+
var opts = {
|
|
931
|
+
reconnection: false,
|
|
932
|
+
rememberUpgrade: !this.cfg.onlyLongpolling && !degraded,
|
|
933
|
+
timeout: 20000,
|
|
934
|
+
auth: _extends({
|
|
935
|
+
token: this.auth.token
|
|
936
|
+
}, this.cfg.extraAuth || {}),
|
|
937
|
+
transports: transports,
|
|
938
|
+
upgrade: !this.cfg.onlyLongpolling && !degraded
|
|
939
|
+
};
|
|
940
|
+
if (!isBrowser) {
|
|
941
|
+
opts.transportOptions = {
|
|
942
|
+
polling: {
|
|
943
|
+
extraHeaders: headers
|
|
944
|
+
},
|
|
945
|
+
websocket: {
|
|
946
|
+
extraHeaders: headers
|
|
947
|
+
}
|
|
948
|
+
};
|
|
949
|
+
} else if (this.cfg.type === exports.ConnectionType.LongPolling || this.cfg.onlyLongpolling) {
|
|
950
|
+
var query = {};
|
|
951
|
+
if (this.cfg.extraAuth) {
|
|
952
|
+
Object.entries(this.cfg.extraAuth).forEach(function (_ref) {
|
|
953
|
+
var key = _ref[0],
|
|
954
|
+
value = _ref[1];
|
|
955
|
+
query[key] = String(value);
|
|
956
|
+
});
|
|
957
|
+
}
|
|
958
|
+
opts.query = query;
|
|
959
|
+
}
|
|
960
|
+
this.logger.debug('Socket options built', {
|
|
961
|
+
isBrowser: isBrowser,
|
|
962
|
+
hasExtraAuth: !!this.cfg.extraAuth,
|
|
963
|
+
hasHeaders: !!this.cfg.headers,
|
|
964
|
+
timeout: opts.timeout,
|
|
965
|
+
transports: opts.transports,
|
|
966
|
+
onlyLongpolling: this.cfg.onlyLongpolling,
|
|
967
|
+
degraded: degraded,
|
|
968
|
+
rememberUpgrade: opts.rememberUpgrade,
|
|
969
|
+
upgrade: opts.upgrade
|
|
970
|
+
});
|
|
971
|
+
return opts;
|
|
972
|
+
};
|
|
973
|
+
_proto.handleConnError = function handleConnError(err) {
|
|
974
|
+
var _this2 = this;
|
|
975
|
+
this.logger.error('Connection error occurred', {
|
|
976
|
+
error: (err === null || err === void 0 ? void 0 : err.message) || err,
|
|
977
|
+
errorType: (err === null || err === void 0 ? void 0 : err.type) || 'unknown',
|
|
978
|
+
willReconnect: this.cfg.autoReconnect && this.reconnectCount < this.cfg.reconnectAttempts
|
|
979
|
+
});
|
|
980
|
+
this.setStatus(exports.ConnectionStatus.Error);
|
|
981
|
+
this.errorListeners.forEach(function (cb) {
|
|
982
|
+
try {
|
|
983
|
+
cb(err);
|
|
984
|
+
} catch (listenerErr) {
|
|
985
|
+
_this2.logger.warn('Error in error listener', listenerErr);
|
|
986
|
+
}
|
|
987
|
+
});
|
|
988
|
+
this.clearTimers();
|
|
989
|
+
this.scheduleReconnect();
|
|
990
|
+
};
|
|
991
|
+
_proto.processQueue = function processQueue() {
|
|
992
|
+
try {
|
|
993
|
+
var _temp3 = function _temp3() {
|
|
994
|
+
_this3.processingQueue = false;
|
|
995
|
+
if (_this3.queue.length) {
|
|
996
|
+
_this3.logger.debug('Queue still has messages, scheduling next processing', {
|
|
997
|
+
remainingMessages: _this3.queue.length
|
|
998
|
+
});
|
|
999
|
+
setTimeout(function () {
|
|
1000
|
+
return _this3.processQueue();
|
|
1001
|
+
}, 100);
|
|
1002
|
+
}
|
|
1003
|
+
};
|
|
1004
|
+
var _interrupt = false;
|
|
1005
|
+
var _this3 = this;
|
|
1006
|
+
if (_this3.processingQueue || _this3.status !== exports.ConnectionStatus.Connected) {
|
|
1007
|
+
_this3.logger.debug('Skipping queue processing', {
|
|
1008
|
+
processingQueue: _this3.processingQueue,
|
|
1009
|
+
status: _this3.status,
|
|
1010
|
+
queueLength: _this3.queue.length
|
|
1011
|
+
});
|
|
1012
|
+
return Promise.resolve();
|
|
1013
|
+
}
|
|
1014
|
+
if (_this3.queue.length === 0) {
|
|
1015
|
+
_this3.logger.debug('Queue is empty, nothing to process');
|
|
1016
|
+
return Promise.resolve();
|
|
1017
|
+
}
|
|
1018
|
+
_this3.logger.debug('Starting queue processing', {
|
|
1019
|
+
queueLength: _this3.queue.length
|
|
1020
|
+
});
|
|
1021
|
+
_this3.processingQueue = true;
|
|
1022
|
+
var _temp2 = _for(function () {
|
|
1023
|
+
return !_interrupt && !!_this3.queue.length && _this3.status === exports.ConnectionStatus.Connected;
|
|
1024
|
+
}, void 0, function () {
|
|
1025
|
+
var q = _this3.queue[0];
|
|
1026
|
+
q.attempts += 1;
|
|
1027
|
+
_this3.logger.debug('Processing queued message', {
|
|
1028
|
+
messageId: q.id,
|
|
1029
|
+
attempt: q.attempts,
|
|
1030
|
+
maxAttempts: q.maxAttempts,
|
|
1031
|
+
age: Date.now() - q.timestamp
|
|
1032
|
+
});
|
|
1033
|
+
var _temp = _catch(function () {
|
|
1034
|
+
return Promise.resolve(_this3.sendMessageHttp(q.message)).then(function () {
|
|
1035
|
+
_this3.logger.info('Queued message sent successfully', {
|
|
1036
|
+
messageId: q.id,
|
|
1037
|
+
attempts: q.attempts
|
|
1038
|
+
});
|
|
1039
|
+
_this3.queue.shift();
|
|
1040
|
+
_this3.saveQueue();
|
|
1041
|
+
});
|
|
1042
|
+
}, function (err) {
|
|
1043
|
+
_this3.logger.error("Failed to send queued message (attempt " + q.attempts + "/" + q.maxAttempts + ")", {
|
|
1044
|
+
messageId: q.id,
|
|
1045
|
+
error: err
|
|
1046
|
+
});
|
|
1047
|
+
if (q.attempts >= q.maxAttempts) {
|
|
1048
|
+
_this3.logger.warn('Message exceeded max attempts, removing from queue', {
|
|
1049
|
+
messageId: q.id
|
|
1050
|
+
});
|
|
1051
|
+
_this3.queue.shift();
|
|
1052
|
+
}
|
|
1053
|
+
_this3.saveQueue();
|
|
1054
|
+
_interrupt = true;
|
|
1055
|
+
});
|
|
1056
|
+
if (_temp && _temp.then) return _temp.then(function () {});
|
|
1057
|
+
});
|
|
1058
|
+
return Promise.resolve(_temp2 && _temp2.then ? _temp2.then(_temp3) : _temp3(_temp2));
|
|
1059
|
+
} catch (e) {
|
|
1060
|
+
return Promise.reject(e);
|
|
1061
|
+
}
|
|
1062
|
+
};
|
|
1063
|
+
_proto.sendMessageHttp = function sendMessageHttp(msg) {
|
|
1064
|
+
try {
|
|
1065
|
+
var _this4 = this;
|
|
1066
|
+
_this4.logger.debug('Sending message via HTTP', {
|
|
1067
|
+
receiver: msg.receiver_client_id,
|
|
1068
|
+
hasContent: !!msg.content,
|
|
1069
|
+
hasAttachments: !!(msg.attachments && msg.attachments.length > 0)
|
|
1070
|
+
});
|
|
1071
|
+
_this4.logger.time('sendMessage');
|
|
1072
|
+
return Promise.resolve(_catch(function () {
|
|
1073
|
+
return Promise.resolve(_this4.api.sendMessage(msg)).then(function () {
|
|
1074
|
+
_this4.logger.timeEnd('sendMessage');
|
|
1075
|
+
_this4.logger.debug('Message sent successfully via HTTP');
|
|
1076
|
+
});
|
|
1077
|
+
}, function (err) {
|
|
1078
|
+
_this4.logger.timeEnd('sendMessage');
|
|
1079
|
+
_this4.logger.error('Failed to send message via HTTP', err);
|
|
1080
|
+
throw err;
|
|
1081
|
+
}));
|
|
1082
|
+
} catch (e) {
|
|
1083
|
+
return Promise.reject(e);
|
|
1084
|
+
}
|
|
1085
|
+
};
|
|
1086
|
+
_proto.handleEvent = function handleEvent(evt) {
|
|
1087
|
+
var _this5 = this;
|
|
1088
|
+
var listeners = this.eventListeners.get(evt.type) || [];
|
|
1089
|
+
this.logger.debug('Handling event', {
|
|
1090
|
+
type: evt.type,
|
|
1091
|
+
listenerCount: listeners.length,
|
|
1092
|
+
hasData: !!evt.data
|
|
1093
|
+
});
|
|
1094
|
+
listeners.forEach(function (cb, index) {
|
|
1095
|
+
try {
|
|
1096
|
+
cb(evt);
|
|
1097
|
+
} catch (err) {
|
|
1098
|
+
_this5.logger.error("Event listener error for " + evt.type, {
|
|
1099
|
+
listenerIndex: index,
|
|
1100
|
+
error: err
|
|
1101
|
+
});
|
|
1102
|
+
}
|
|
1103
|
+
});
|
|
1104
|
+
};
|
|
1105
|
+
_proto.setStatus = function setStatus(s) {
|
|
1106
|
+
var _this6 = this;
|
|
1107
|
+
if (this.status === s) {
|
|
1108
|
+
this.logger.debug('Status unchanged', {
|
|
1109
|
+
status: s
|
|
1110
|
+
});
|
|
1111
|
+
return;
|
|
1112
|
+
}
|
|
1113
|
+
var oldStatus = this.status;
|
|
1114
|
+
this.status = s;
|
|
1115
|
+
this.logger.info('Connection status changed', {
|
|
1116
|
+
from: oldStatus,
|
|
1117
|
+
to: s,
|
|
1118
|
+
listenerCount: this.statusListeners.length
|
|
1119
|
+
});
|
|
1120
|
+
this.statusListeners.forEach(function (cb, index) {
|
|
1121
|
+
try {
|
|
1122
|
+
cb(s);
|
|
1123
|
+
} catch (e) {
|
|
1124
|
+
_this6.logger.error('Status listener error', {
|
|
1125
|
+
listenerIndex: index,
|
|
1126
|
+
error: e
|
|
1127
|
+
});
|
|
1128
|
+
}
|
|
1129
|
+
});
|
|
1130
|
+
};
|
|
1131
|
+
_proto.scheduleReconnect = function scheduleReconnect() {
|
|
1132
|
+
var _this7 = this;
|
|
1133
|
+
if (!this.cfg.autoReconnect) {
|
|
1134
|
+
this.logger.debug('Auto-reconnect disabled, not scheduling reconnect');
|
|
1135
|
+
return;
|
|
1136
|
+
}
|
|
1137
|
+
if (this.reconnectCount >= this.cfg.reconnectAttempts) {
|
|
1138
|
+
this.logger.warn('Max reconnect attempts reached', {
|
|
1139
|
+
reconnectCount: this.reconnectCount,
|
|
1140
|
+
maxAttempts: this.cfg.reconnectAttempts
|
|
1141
|
+
});
|
|
1142
|
+
return;
|
|
1143
|
+
}
|
|
1144
|
+
this.reconnectCount += 1;
|
|
1145
|
+
this.logger.info('Scheduling reconnect', {
|
|
1146
|
+
attempt: this.reconnectCount,
|
|
1147
|
+
maxAttempts: this.cfg.reconnectAttempts,
|
|
1148
|
+
delayMs: this.cfg.reconnectDelay
|
|
1149
|
+
});
|
|
1150
|
+
setTimeout(function () {
|
|
1151
|
+
_this7.logger.debug('Executing scheduled reconnect', {
|
|
1152
|
+
attempt: _this7.reconnectCount
|
|
1153
|
+
});
|
|
1154
|
+
_this7.connect();
|
|
1155
|
+
}, this.cfg.reconnectDelay);
|
|
1156
|
+
};
|
|
1157
|
+
_proto.clearTimers = function clearTimers() {};
|
|
1158
|
+
_proto.saveQueue = function saveQueue() {
|
|
1159
|
+
if (typeof window === 'undefined') return;
|
|
1160
|
+
try {
|
|
1161
|
+
sessionStorage.setItem(QUEUE_KEY, JSON.stringify(this.queue));
|
|
1162
|
+
this.logger.debug('Queue saved to session storage', {
|
|
1163
|
+
count: this.queue.length
|
|
1164
|
+
});
|
|
1165
|
+
} catch (err) {
|
|
1166
|
+
this.logger.warn('Failed to save queue to session storage', err);
|
|
1167
|
+
}
|
|
1168
|
+
};
|
|
1169
|
+
_proto.add = function add(m, k, cb) {
|
|
1170
|
+
if (!m.has(k)) m.set(k, []);
|
|
1171
|
+
m.get(k).push(cb);
|
|
1172
|
+
};
|
|
1173
|
+
_proto.remove = function remove(m, k, cb) {
|
|
1174
|
+
var arr = m.get(k);
|
|
1175
|
+
if (!arr) return;
|
|
1176
|
+
var i = arr.indexOf(cb);
|
|
1177
|
+
if (i !== -1) arr.splice(i, 1);
|
|
1178
|
+
};
|
|
1179
|
+
_proto.storageAvailable = function storageAvailable() {
|
|
1180
|
+
try {
|
|
1181
|
+
if (typeof window === 'undefined') return false;
|
|
1182
|
+
var testKey = '__wsdeg__';
|
|
1183
|
+
window.localStorage.setItem(testKey, '1');
|
|
1184
|
+
window.localStorage.removeItem(testKey);
|
|
1185
|
+
return true;
|
|
1186
|
+
} catch (_unused) {
|
|
1187
|
+
return false;
|
|
1188
|
+
}
|
|
1189
|
+
};
|
|
1190
|
+
_proto.failKey = function failKey() {
|
|
1191
|
+
return "WS_FAIL_COUNT::" + this.auth.socketBaseUrl;
|
|
1192
|
+
};
|
|
1193
|
+
_proto.untilKey = function untilKey() {
|
|
1194
|
+
return "WS_DEGRADE_UNTIL::" + this.auth.socketBaseUrl;
|
|
1195
|
+
};
|
|
1196
|
+
_proto.getFailCount = function getFailCount() {
|
|
1197
|
+
if (!this.storageAvailable()) return this.wsFailCount;
|
|
1198
|
+
var v = window.localStorage.getItem(this.failKey());
|
|
1199
|
+
return v ? parseInt(v, 10) || 0 : 0;
|
|
1200
|
+
};
|
|
1201
|
+
_proto.setFailCount = function setFailCount(n) {
|
|
1202
|
+
this.wsFailCount = n;
|
|
1203
|
+
if (!this.storageAvailable()) return;
|
|
1204
|
+
try {
|
|
1205
|
+
window.localStorage.setItem(this.failKey(), String(n));
|
|
1206
|
+
} catch (_unused2) {}
|
|
1207
|
+
};
|
|
1208
|
+
_proto.resetWsFailures = function resetWsFailures() {
|
|
1209
|
+
if (!this.cfg.degradeWsOnFailure) return;
|
|
1210
|
+
this.setFailCount(0);
|
|
1211
|
+
};
|
|
1212
|
+
_proto.getDegradeUntil = function getDegradeUntil() {
|
|
1213
|
+
if (!this.storageAvailable()) return null;
|
|
1214
|
+
var v = window.localStorage.getItem(this.untilKey());
|
|
1215
|
+
return v ? parseInt(v, 10) || null : null;
|
|
1216
|
+
};
|
|
1217
|
+
_proto.setDegradeUntil = function setDegradeUntil(ts) {
|
|
1218
|
+
if (!this.storageAvailable()) return;
|
|
1219
|
+
try {
|
|
1220
|
+
window.localStorage.setItem(this.untilKey(), String(ts));
|
|
1221
|
+
} catch (_unused3) {}
|
|
1222
|
+
};
|
|
1223
|
+
_proto.clearDegradation = function clearDegradation() {
|
|
1224
|
+
if (!this.storageAvailable()) return;
|
|
1225
|
+
try {
|
|
1226
|
+
window.localStorage.removeItem(this.untilKey());
|
|
1227
|
+
window.localStorage.removeItem(this.failKey());
|
|
1228
|
+
} catch (_unused4) {}
|
|
1229
|
+
};
|
|
1230
|
+
_proto.onWsFailure = function onWsFailure() {
|
|
1231
|
+
if (!this.cfg.degradeWsOnFailure || this.cfg.forceWebSocket) return;
|
|
1232
|
+
if (this.isDegraded || this.cfg.onlyLongpolling) return;
|
|
1233
|
+
var current = this.getFailCount() + 1;
|
|
1234
|
+
this.setFailCount(current);
|
|
1235
|
+
this.logger.warn('WebSocket failure counted', {
|
|
1236
|
+
count: current,
|
|
1237
|
+
threshold: this.cfg.wsFailureThreshold
|
|
1238
|
+
});
|
|
1239
|
+
if (current >= (this.cfg.wsFailureThreshold || 3)) {
|
|
1240
|
+
var ttl = this.cfg.wsDegradeTTLms || 24 * 60 * 60 * 1000;
|
|
1241
|
+
var until = Date.now() + ttl;
|
|
1242
|
+
this.isDegraded = true;
|
|
1243
|
+
this.setDegradeUntil(until);
|
|
1244
|
+
this.setFailCount(0);
|
|
1245
|
+
this.logger.error('Entering degraded mode: polling-only', {
|
|
1246
|
+
until: until
|
|
1247
|
+
});
|
|
1248
|
+
try {
|
|
1249
|
+
this.disconnect();
|
|
1250
|
+
} finally {
|
|
1251
|
+
this.connect();
|
|
1252
|
+
}
|
|
1253
|
+
}
|
|
1254
|
+
};
|
|
1255
|
+
return ConnectionManager;
|
|
1256
|
+
}();
|
|
1257
|
+
ConnectionManager.instance = null;
|
|
1258
|
+
|
|
1259
|
+
var defaultContext = {
|
|
1260
|
+
connection: null,
|
|
1261
|
+
status: exports.ConnectionStatus.Disconnected,
|
|
1262
|
+
connect: function connect() {},
|
|
1263
|
+
disconnect: function disconnect() {},
|
|
1264
|
+
sendMessage: function sendMessage() {
|
|
1265
|
+
return null;
|
|
1266
|
+
},
|
|
1267
|
+
on: function on() {},
|
|
1268
|
+
off: function off() {},
|
|
1269
|
+
onError: function onError() {},
|
|
1270
|
+
offError: function offError() {},
|
|
1271
|
+
updateLogging: function updateLogging() {},
|
|
1272
|
+
getLoggingConfig: function getLoggingConfig() {
|
|
1273
|
+
return null;
|
|
1274
|
+
}
|
|
1275
|
+
};
|
|
1276
|
+
var ConnectionContext = React.createContext(defaultContext);
|
|
1277
|
+
var ConnectionProvider = function ConnectionProvider(_ref) {
|
|
1278
|
+
var children = _ref.children,
|
|
1279
|
+
authConfig = _ref.authConfig,
|
|
1280
|
+
api = _ref.api,
|
|
1281
|
+
connectionOptions = _ref.connectionOptions,
|
|
1282
|
+
_ref$autoConnect = _ref.autoConnect,
|
|
1283
|
+
autoConnect = _ref$autoConnect === void 0 ? true : _ref$autoConnect;
|
|
1284
|
+
var _useState = React.useState(null),
|
|
1285
|
+
connection = _useState[0],
|
|
1286
|
+
setConnection = _useState[1];
|
|
1287
|
+
var _useState2 = React.useState(exports.ConnectionStatus.Disconnected),
|
|
1288
|
+
status = _useState2[0],
|
|
1289
|
+
setStatus = _useState2[1];
|
|
1290
|
+
React.useEffect(function () {
|
|
1291
|
+
if (!authConfig || !api) {
|
|
1292
|
+
if (connection) {
|
|
1293
|
+
connection.disconnect();
|
|
1294
|
+
setConnection(null);
|
|
1295
|
+
setStatus(exports.ConnectionStatus.Disconnected);
|
|
1296
|
+
}
|
|
1297
|
+
return;
|
|
1298
|
+
}
|
|
1299
|
+
var newConnection = ConnectionManager.getInstance(authConfig, api, connectionOptions);
|
|
1300
|
+
newConnection.onStatusChange(setStatus);
|
|
1301
|
+
setConnection(newConnection);
|
|
1302
|
+
if (autoConnect) {
|
|
1303
|
+
newConnection.connect();
|
|
1304
|
+
}
|
|
1305
|
+
return function () {
|
|
1306
|
+
newConnection.disconnect();
|
|
1307
|
+
ConnectionManager.resetInstance();
|
|
1308
|
+
};
|
|
1309
|
+
}, [authConfig, connectionOptions, autoConnect, api]);
|
|
1310
|
+
var connect = React.useCallback(function () {
|
|
1311
|
+
if (connection) {
|
|
1312
|
+
connection.connect();
|
|
1313
|
+
}
|
|
1314
|
+
}, [connection]);
|
|
1315
|
+
var disconnect = React.useCallback(function () {
|
|
1316
|
+
if (connection) {
|
|
1317
|
+
connection.disconnect();
|
|
1318
|
+
}
|
|
1319
|
+
}, [connection]);
|
|
1320
|
+
var sendMessage = React.useCallback(function (message, maxAttempts) {
|
|
1321
|
+
if (maxAttempts === void 0) {
|
|
1322
|
+
maxAttempts = 3;
|
|
1323
|
+
}
|
|
1324
|
+
if (!connection) {
|
|
1325
|
+
return null;
|
|
1326
|
+
}
|
|
1327
|
+
return connection.queueMessage(message, maxAttempts);
|
|
1328
|
+
}, [connection]);
|
|
1329
|
+
var on = React.useCallback(function (eventType, callback) {
|
|
1330
|
+
if (connection) {
|
|
1331
|
+
connection.on(eventType, callback);
|
|
1332
|
+
}
|
|
1333
|
+
}, [connection]);
|
|
1334
|
+
var off = React.useCallback(function (eventType, callback) {
|
|
1335
|
+
if (connection) {
|
|
1336
|
+
connection.off(eventType, callback);
|
|
1337
|
+
}
|
|
1338
|
+
}, [connection]);
|
|
1339
|
+
var onError = React.useCallback(function (cb) {
|
|
1340
|
+
if (connection) {
|
|
1341
|
+
connection.onError(cb);
|
|
1342
|
+
}
|
|
1343
|
+
}, [connection]);
|
|
1344
|
+
var offError = React.useCallback(function (cb) {
|
|
1345
|
+
if (connection) {
|
|
1346
|
+
connection.offError(cb);
|
|
1347
|
+
}
|
|
1348
|
+
}, [connection]);
|
|
1349
|
+
var updateLogging = React.useCallback(function (config) {
|
|
1350
|
+
if (connection) {
|
|
1351
|
+
connection.updateLogging(config);
|
|
1352
|
+
}
|
|
1353
|
+
}, [connection]);
|
|
1354
|
+
var getLoggingConfig = React.useCallback(function () {
|
|
1355
|
+
if (connection) {
|
|
1356
|
+
return connection.getLoggingConfig();
|
|
1357
|
+
}
|
|
1358
|
+
return null;
|
|
1359
|
+
}, [connection]);
|
|
1360
|
+
var value = React.useMemo(function () {
|
|
1361
|
+
return {
|
|
1362
|
+
connection: connection,
|
|
1363
|
+
status: status,
|
|
1364
|
+
connect: connect,
|
|
1365
|
+
disconnect: disconnect,
|
|
1366
|
+
sendMessage: sendMessage,
|
|
1367
|
+
on: on,
|
|
1368
|
+
off: off,
|
|
1369
|
+
onError: onError,
|
|
1370
|
+
offError: offError,
|
|
1371
|
+
updateLogging: updateLogging,
|
|
1372
|
+
getLoggingConfig: getLoggingConfig
|
|
1373
|
+
};
|
|
1374
|
+
}, [connection, status, connect, disconnect, sendMessage, on, off, onError, offError, updateLogging, getLoggingConfig]);
|
|
1375
|
+
return React__default.createElement(ConnectionContext.Provider, {
|
|
1376
|
+
value: value
|
|
1377
|
+
}, children);
|
|
1378
|
+
};
|
|
1379
|
+
var useConnectionContext = function useConnectionContext() {
|
|
1380
|
+
return React.useContext(ConnectionContext);
|
|
1381
|
+
};
|
|
1382
|
+
|
|
1383
|
+
var defaultContext$1 = {
|
|
1384
|
+
api: null,
|
|
1385
|
+
isInitialized: false,
|
|
1386
|
+
isAuthenticated: false,
|
|
1387
|
+
initialize: function initialize() {},
|
|
1388
|
+
conversations: [],
|
|
1389
|
+
refreshConversations: function () {
|
|
1390
|
+
try {
|
|
1391
|
+
return Promise.resolve([]);
|
|
1392
|
+
} catch (e) {
|
|
1393
|
+
return Promise.reject(e);
|
|
1394
|
+
}
|
|
1395
|
+
},
|
|
1396
|
+
setConversations: function setConversations() {}
|
|
1397
|
+
};
|
|
1398
|
+
var ChatContext = React.createContext(defaultContext$1);
|
|
1399
|
+
var ChatProvider = function ChatProvider(_ref) {
|
|
1400
|
+
var children = _ref.children,
|
|
1401
|
+
config = _ref.config,
|
|
1402
|
+
connectionOptions = _ref.connectionOptions;
|
|
1403
|
+
var _useState = React.useState(null),
|
|
1404
|
+
api = _useState[0],
|
|
1405
|
+
setApi = _useState[1];
|
|
1406
|
+
var _useState2 = React.useState(false),
|
|
1407
|
+
isInitialized = _useState2[0],
|
|
1408
|
+
setIsInitialized = _useState2[1];
|
|
1409
|
+
var _useState3 = React.useState(false),
|
|
1410
|
+
isAuthenticated = _useState3[0],
|
|
1411
|
+
setIsAuthenticated = _useState3[1];
|
|
1412
|
+
var _useState4 = React.useState([]),
|
|
1413
|
+
conversations = _useState4[0],
|
|
1414
|
+
setConversations = _useState4[1];
|
|
1415
|
+
var initialize = React.useCallback(function (config) {
|
|
1416
|
+
var chatApi = new ChatApi(config);
|
|
1417
|
+
setApi(chatApi);
|
|
1418
|
+
setIsInitialized(true);
|
|
1419
|
+
setIsAuthenticated(true);
|
|
1420
|
+
}, []);
|
|
1421
|
+
var refreshConversations = React.useCallback(function (archived, clientIds) {
|
|
1422
|
+
try {
|
|
1423
|
+
var _temp2 = function _temp2(_result) {
|
|
1424
|
+
return _exit ? _result : [];
|
|
1425
|
+
};
|
|
1426
|
+
var _exit = false;
|
|
1427
|
+
if (!api) return Promise.resolve([]);
|
|
1428
|
+
var _temp = _catch(function () {
|
|
1429
|
+
return Promise.resolve(api.listConversations(archived, clientIds)).then(function (data) {
|
|
1430
|
+
setConversations(data);
|
|
1431
|
+
_exit = true;
|
|
1432
|
+
return data;
|
|
1433
|
+
});
|
|
1434
|
+
}, function (error) {
|
|
1435
|
+
console.error('Failed to fetch conversations:', error);
|
|
1436
|
+
});
|
|
1437
|
+
return Promise.resolve(_temp && _temp.then ? _temp.then(_temp2) : _temp2(_temp));
|
|
1438
|
+
} catch (e) {
|
|
1439
|
+
return Promise.reject(e);
|
|
1440
|
+
}
|
|
1441
|
+
}, [api]);
|
|
1442
|
+
React.useEffect(function () {
|
|
1443
|
+
if (config) {
|
|
1444
|
+
initialize(config);
|
|
1445
|
+
}
|
|
1446
|
+
}, [config]);
|
|
1447
|
+
React.useEffect(function () {
|
|
1448
|
+
if (isAuthenticated) {
|
|
1449
|
+
refreshConversations();
|
|
1450
|
+
}
|
|
1451
|
+
}, [isAuthenticated]);
|
|
1452
|
+
var value = React.useMemo(function () {
|
|
1453
|
+
return {
|
|
1454
|
+
api: api,
|
|
1455
|
+
isInitialized: isInitialized,
|
|
1456
|
+
isAuthenticated: isAuthenticated,
|
|
1457
|
+
initialize: initialize,
|
|
1458
|
+
conversations: conversations,
|
|
1459
|
+
refreshConversations: refreshConversations,
|
|
1460
|
+
setConversations: setConversations
|
|
1461
|
+
};
|
|
1462
|
+
}, [api, isInitialized, isAuthenticated, conversations, refreshConversations]);
|
|
1463
|
+
return React__default.createElement(ChatContext.Provider, {
|
|
1464
|
+
value: value
|
|
1465
|
+
}, React__default.createElement(ConnectionProvider, {
|
|
1466
|
+
authConfig: config,
|
|
1467
|
+
api: api || undefined,
|
|
1468
|
+
connectionOptions: connectionOptions,
|
|
1469
|
+
autoConnect: isAuthenticated
|
|
1470
|
+
}, children));
|
|
1471
|
+
};
|
|
1472
|
+
var useChatContext = function useChatContext() {
|
|
1473
|
+
return React.useContext(ChatContext);
|
|
1474
|
+
};
|
|
1475
|
+
|
|
1476
|
+
function useRealtime(eventType) {
|
|
1477
|
+
var _useConnectionContext = useConnectionContext(),
|
|
1478
|
+
on = _useConnectionContext.on,
|
|
1479
|
+
off = _useConnectionContext.off;
|
|
1480
|
+
var _useState = React.useState(null),
|
|
1481
|
+
event = _useState[0],
|
|
1482
|
+
setEvent = _useState[1];
|
|
1483
|
+
var handleEvent = React.useCallback(function (newEvent) {
|
|
1484
|
+
setEvent(newEvent);
|
|
1485
|
+
}, []);
|
|
1486
|
+
React.useEffect(function () {
|
|
1487
|
+
on(eventType, handleEvent);
|
|
1488
|
+
return function () {
|
|
1489
|
+
off(eventType, handleEvent);
|
|
1490
|
+
};
|
|
1491
|
+
}, [eventType, on, off, handleEvent]);
|
|
1492
|
+
var clearEvent = React.useCallback(function () {
|
|
1493
|
+
setEvent(null);
|
|
1494
|
+
}, []);
|
|
1495
|
+
return {
|
|
1496
|
+
event: event,
|
|
1497
|
+
clearEvent: clearEvent
|
|
1498
|
+
};
|
|
1499
|
+
}
|
|
1500
|
+
function useMessageSentEvents() {
|
|
1501
|
+
return useRealtime(exports.EventType.MessageSent);
|
|
1502
|
+
}
|
|
1503
|
+
function useMessageEditedEvents() {
|
|
1504
|
+
return useRealtime(exports.EventType.MessageEdited);
|
|
1505
|
+
}
|
|
1506
|
+
function useMessageDeletedEvents() {
|
|
1507
|
+
return useRealtime(exports.EventType.MessageDeleted);
|
|
1508
|
+
}
|
|
1509
|
+
function useMessageReadEvents() {
|
|
1510
|
+
return useRealtime(exports.EventType.MessageRead);
|
|
1511
|
+
}
|
|
1512
|
+
function useConversationReadEvents() {
|
|
1513
|
+
return useRealtime(exports.EventType.ConversationRead);
|
|
1514
|
+
}
|
|
1515
|
+
function useAllMessageEvents(callback) {
|
|
1516
|
+
var _useMessageSentEvents = useMessageSentEvents(),
|
|
1517
|
+
messageSent = _useMessageSentEvents.event,
|
|
1518
|
+
clearMessageSent = _useMessageSentEvents.clearEvent;
|
|
1519
|
+
var _useMessageEditedEven = useMessageEditedEvents(),
|
|
1520
|
+
messageEdited = _useMessageEditedEven.event,
|
|
1521
|
+
clearMessageEdited = _useMessageEditedEven.clearEvent;
|
|
1522
|
+
var _useMessageDeletedEve = useMessageDeletedEvents(),
|
|
1523
|
+
messageDeleted = _useMessageDeletedEve.event,
|
|
1524
|
+
clearMessageDeleted = _useMessageDeletedEve.clearEvent;
|
|
1525
|
+
var _useMessageReadEvents = useMessageReadEvents(),
|
|
1526
|
+
messageRead = _useMessageReadEvents.event,
|
|
1527
|
+
clearMessageRead = _useMessageReadEvents.clearEvent;
|
|
1528
|
+
var _useConversationReadE = useConversationReadEvents(),
|
|
1529
|
+
conversationRead = _useConversationReadE.event,
|
|
1530
|
+
clearConversationRead = _useConversationReadE.clearEvent;
|
|
1531
|
+
var clearEvents = React.useCallback(function () {
|
|
1532
|
+
clearMessageSent();
|
|
1533
|
+
clearMessageEdited();
|
|
1534
|
+
clearMessageDeleted();
|
|
1535
|
+
clearMessageRead();
|
|
1536
|
+
clearConversationRead();
|
|
1537
|
+
}, [clearMessageSent, clearMessageEdited, clearMessageDeleted, clearMessageRead, clearConversationRead]);
|
|
1538
|
+
React.useEffect(function () {
|
|
1539
|
+
if (messageSent && callback) {
|
|
1540
|
+
callback(exports.EventType.MessageSent, messageSent.data);
|
|
1541
|
+
}
|
|
1542
|
+
}, [messageSent, callback]);
|
|
1543
|
+
React.useEffect(function () {
|
|
1544
|
+
if (messageEdited && callback) {
|
|
1545
|
+
callback(exports.EventType.MessageEdited, messageEdited.data);
|
|
1546
|
+
}
|
|
1547
|
+
}, [messageEdited, callback]);
|
|
1548
|
+
React.useEffect(function () {
|
|
1549
|
+
if (messageDeleted && callback) {
|
|
1550
|
+
callback(exports.EventType.MessageDeleted, messageDeleted.data);
|
|
1551
|
+
}
|
|
1552
|
+
}, [messageDeleted, callback]);
|
|
1553
|
+
React.useEffect(function () {
|
|
1554
|
+
if (messageRead && callback) {
|
|
1555
|
+
callback(exports.EventType.MessageRead, messageRead.data);
|
|
1556
|
+
}
|
|
1557
|
+
}, [messageRead, callback]);
|
|
1558
|
+
React.useEffect(function () {
|
|
1559
|
+
if (conversationRead && callback) {
|
|
1560
|
+
callback(exports.EventType.ConversationRead, conversationRead.data);
|
|
1561
|
+
}
|
|
1562
|
+
}, [conversationRead, callback]);
|
|
1563
|
+
return {
|
|
1564
|
+
messageSent: messageSent,
|
|
1565
|
+
messageEdited: messageEdited,
|
|
1566
|
+
messageDeleted: messageDeleted,
|
|
1567
|
+
messageRead: messageRead,
|
|
1568
|
+
conversationRead: conversationRead,
|
|
1569
|
+
clearEvents: clearEvents
|
|
1570
|
+
};
|
|
1571
|
+
}
|
|
1572
|
+
|
|
1573
|
+
var useConversations = function useConversations() {
|
|
1574
|
+
var _useChatContext = useChatContext(),
|
|
1575
|
+
api = _useChatContext.api,
|
|
1576
|
+
conversations = _useChatContext.conversations,
|
|
1577
|
+
refreshConversations = _useChatContext.refreshConversations,
|
|
1578
|
+
setConversations = _useChatContext.setConversations;
|
|
1579
|
+
var _useState = React.useState(false),
|
|
1580
|
+
loading = _useState[0],
|
|
1581
|
+
setLoading = _useState[1];
|
|
1582
|
+
var _useState2 = React.useState(null),
|
|
1583
|
+
error = _useState2[0],
|
|
1584
|
+
setError = _useState2[1];
|
|
1585
|
+
var eventProcessorPipeline = React.useCallback(function () {
|
|
1586
|
+
console.log('Message event received');
|
|
1587
|
+
refreshConversations();
|
|
1588
|
+
}, []);
|
|
1589
|
+
useAllMessageEvents(eventProcessorPipeline);
|
|
1590
|
+
var getConversations = React.useCallback(function (archived, clientIds) {
|
|
1591
|
+
try {
|
|
1592
|
+
if (!api) {
|
|
1593
|
+
setError(new Error('API not initialized'));
|
|
1594
|
+
return Promise.resolve([]);
|
|
1595
|
+
}
|
|
1596
|
+
setLoading(true);
|
|
1597
|
+
setError(null);
|
|
1598
|
+
return Promise.resolve(_finallyRethrows(function () {
|
|
1599
|
+
return _catch(function () {
|
|
1600
|
+
return Promise.resolve(refreshConversations(archived, clientIds));
|
|
1601
|
+
}, function (err) {
|
|
1602
|
+
var error = err instanceof Error ? err : new Error('Failed to get conversations');
|
|
1603
|
+
setError(error);
|
|
1604
|
+
return [];
|
|
1605
|
+
});
|
|
1606
|
+
}, function (_wasThrown, _result) {
|
|
1607
|
+
setLoading(false);
|
|
1608
|
+
if (_wasThrown) throw _result;
|
|
1609
|
+
return _result;
|
|
1610
|
+
}));
|
|
1611
|
+
} catch (e) {
|
|
1612
|
+
return Promise.reject(e);
|
|
1613
|
+
}
|
|
1614
|
+
}, [refreshConversations, api]);
|
|
1615
|
+
var deleteConversation = React.useCallback(function (conversationUid) {
|
|
1616
|
+
try {
|
|
1617
|
+
if (!api) {
|
|
1618
|
+
setError(new Error('API not initialized'));
|
|
1619
|
+
return Promise.resolve(null);
|
|
1620
|
+
}
|
|
1621
|
+
setLoading(true);
|
|
1622
|
+
setError(null);
|
|
1623
|
+
return Promise.resolve(_finallyRethrows(function () {
|
|
1624
|
+
return _catch(function () {
|
|
1625
|
+
return Promise.resolve(api.deleteConversation(conversationUid)).then(function (response) {
|
|
1626
|
+
return Promise.resolve(refreshConversations()).then(function () {
|
|
1627
|
+
return response;
|
|
1628
|
+
});
|
|
1629
|
+
});
|
|
1630
|
+
}, function (err) {
|
|
1631
|
+
var error = err instanceof Error ? err : new Error('Failed to delete conversation');
|
|
1632
|
+
setError(error);
|
|
1633
|
+
return null;
|
|
1634
|
+
});
|
|
1635
|
+
}, function (_wasThrown2, _result2) {
|
|
1636
|
+
setLoading(false);
|
|
1637
|
+
if (_wasThrown2) throw _result2;
|
|
1638
|
+
return _result2;
|
|
1639
|
+
}));
|
|
1640
|
+
} catch (e) {
|
|
1641
|
+
return Promise.reject(e);
|
|
1642
|
+
}
|
|
1643
|
+
}, [api, refreshConversations]);
|
|
1644
|
+
var archiveConversation = React.useCallback(function (conversationUid) {
|
|
1645
|
+
try {
|
|
1646
|
+
if (!api) {
|
|
1647
|
+
setError(new Error('API not initialized'));
|
|
1648
|
+
return Promise.resolve(null);
|
|
1649
|
+
}
|
|
1650
|
+
setLoading(true);
|
|
1651
|
+
setError(null);
|
|
1652
|
+
return Promise.resolve(_finallyRethrows(function () {
|
|
1653
|
+
return _catch(function () {
|
|
1654
|
+
return Promise.resolve(api.archiveConversation(conversationUid)).then(function (response) {
|
|
1655
|
+
return Promise.resolve(refreshConversations()).then(function () {
|
|
1656
|
+
return response;
|
|
1657
|
+
});
|
|
1658
|
+
});
|
|
1659
|
+
}, function (err) {
|
|
1660
|
+
var error = err instanceof Error ? err : new Error('Failed to archive conversation');
|
|
1661
|
+
setError(error);
|
|
1662
|
+
return null;
|
|
1663
|
+
});
|
|
1664
|
+
}, function (_wasThrown3, _result3) {
|
|
1665
|
+
setLoading(false);
|
|
1666
|
+
if (_wasThrown3) throw _result3;
|
|
1667
|
+
return _result3;
|
|
1668
|
+
}));
|
|
1669
|
+
} catch (e) {
|
|
1670
|
+
return Promise.reject(e);
|
|
1671
|
+
}
|
|
1672
|
+
}, [api, refreshConversations]);
|
|
1673
|
+
var unarchiveConversation = React.useCallback(function (conversationUid) {
|
|
1674
|
+
try {
|
|
1675
|
+
if (!api) {
|
|
1676
|
+
setError(new Error('API not initialized'));
|
|
1677
|
+
return Promise.resolve(null);
|
|
1678
|
+
}
|
|
1679
|
+
setLoading(true);
|
|
1680
|
+
setError(null);
|
|
1681
|
+
return Promise.resolve(_finallyRethrows(function () {
|
|
1682
|
+
return _catch(function () {
|
|
1683
|
+
return Promise.resolve(api.unarchiveConversation(conversationUid)).then(function (response) {
|
|
1684
|
+
return Promise.resolve(refreshConversations()).then(function () {
|
|
1685
|
+
return response;
|
|
1686
|
+
});
|
|
1687
|
+
});
|
|
1688
|
+
}, function (err) {
|
|
1689
|
+
var error = err instanceof Error ? err : new Error('Failed to unarchive conversation');
|
|
1690
|
+
setError(error);
|
|
1691
|
+
return null;
|
|
1692
|
+
});
|
|
1693
|
+
}, function (_wasThrown4, _result4) {
|
|
1694
|
+
setLoading(false);
|
|
1695
|
+
if (_wasThrown4) throw _result4;
|
|
1696
|
+
return _result4;
|
|
1697
|
+
}));
|
|
1698
|
+
} catch (e) {
|
|
1699
|
+
return Promise.reject(e);
|
|
1700
|
+
}
|
|
1701
|
+
}, [api, refreshConversations]);
|
|
1702
|
+
var getConversationDetails = React.useCallback(function (conversationUid) {
|
|
1703
|
+
try {
|
|
1704
|
+
if (!api) {
|
|
1705
|
+
setError(new Error('API not initialized'));
|
|
1706
|
+
return Promise.resolve(null);
|
|
1707
|
+
}
|
|
1708
|
+
setLoading(true);
|
|
1709
|
+
setError(null);
|
|
1710
|
+
return Promise.resolve(_finallyRethrows(function () {
|
|
1711
|
+
return _catch(function () {
|
|
1712
|
+
return Promise.resolve(api.getConversationDetails(conversationUid));
|
|
1713
|
+
}, function (err) {
|
|
1714
|
+
var error = err instanceof Error ? err : new Error('Failed to get conversation details');
|
|
1715
|
+
setError(error);
|
|
1716
|
+
return null;
|
|
1717
|
+
});
|
|
1718
|
+
}, function (_wasThrown5, _result5) {
|
|
1719
|
+
setLoading(false);
|
|
1720
|
+
if (_wasThrown5) throw _result5;
|
|
1721
|
+
return _result5;
|
|
1722
|
+
}));
|
|
1723
|
+
} catch (e) {
|
|
1724
|
+
return Promise.reject(e);
|
|
1725
|
+
}
|
|
1726
|
+
}, [api]);
|
|
1727
|
+
var searchConversation = React.useCallback(function (conversationUid, term) {
|
|
1728
|
+
try {
|
|
1729
|
+
if (!api) {
|
|
1730
|
+
setError(new Error('API not initialized'));
|
|
1731
|
+
return Promise.resolve(null);
|
|
1732
|
+
}
|
|
1733
|
+
setLoading(true);
|
|
1734
|
+
setError(null);
|
|
1735
|
+
return Promise.resolve(_finallyRethrows(function () {
|
|
1736
|
+
return _catch(function () {
|
|
1737
|
+
return Promise.resolve(api.searchConversation(conversationUid, term));
|
|
1738
|
+
}, function (err) {
|
|
1739
|
+
var error = err instanceof Error ? err : new Error('Failed to search conversation');
|
|
1740
|
+
setError(error);
|
|
1741
|
+
return null;
|
|
1742
|
+
});
|
|
1743
|
+
}, function (_wasThrown6, _result6) {
|
|
1744
|
+
setLoading(false);
|
|
1745
|
+
if (_wasThrown6) throw _result6;
|
|
1746
|
+
return _result6;
|
|
1747
|
+
}));
|
|
1748
|
+
} catch (e) {
|
|
1749
|
+
return Promise.reject(e);
|
|
1750
|
+
}
|
|
1751
|
+
}, [api]);
|
|
1752
|
+
return {
|
|
1753
|
+
conversations: conversations,
|
|
1754
|
+
loading: loading,
|
|
1755
|
+
error: error,
|
|
1756
|
+
getConversations: getConversations,
|
|
1757
|
+
deleteConversation: deleteConversation,
|
|
1758
|
+
archiveConversation: archiveConversation,
|
|
1759
|
+
unarchiveConversation: unarchiveConversation,
|
|
1760
|
+
getConversationDetails: getConversationDetails,
|
|
1761
|
+
searchConversation: searchConversation,
|
|
1762
|
+
setConversations: setConversations
|
|
1763
|
+
};
|
|
1764
|
+
};
|
|
1765
|
+
|
|
1766
|
+
var useConnection = function useConnection() {
|
|
1767
|
+
var _useConnectionContext = useConnectionContext(),
|
|
1768
|
+
status = _useConnectionContext.status,
|
|
1769
|
+
connect = _useConnectionContext.connect,
|
|
1770
|
+
disconnect = _useConnectionContext.disconnect,
|
|
1771
|
+
connection = _useConnectionContext.connection,
|
|
1772
|
+
queueMessage = _useConnectionContext.sendMessage;
|
|
1773
|
+
var connectToServer = React.useCallback(function () {
|
|
1774
|
+
connect();
|
|
1775
|
+
}, [connect]);
|
|
1776
|
+
var disconnectFromServer = React.useCallback(function () {
|
|
1777
|
+
disconnect();
|
|
1778
|
+
}, [disconnect]);
|
|
1779
|
+
var sendMessage = React.useCallback(function (message, maxAttempts) {
|
|
1780
|
+
if (maxAttempts === void 0) {
|
|
1781
|
+
maxAttempts = 3;
|
|
1782
|
+
}
|
|
1783
|
+
return queueMessage(message, maxAttempts);
|
|
1784
|
+
}, [queueMessage]);
|
|
1785
|
+
var isConnected = status === exports.ConnectionStatus.Connected;
|
|
1786
|
+
var isConnecting = status === exports.ConnectionStatus.Connecting;
|
|
1787
|
+
var hasError = status === exports.ConnectionStatus.Error;
|
|
1788
|
+
return {
|
|
1789
|
+
status: status,
|
|
1790
|
+
isConnected: isConnected,
|
|
1791
|
+
isConnecting: isConnecting,
|
|
1792
|
+
hasError: hasError,
|
|
1793
|
+
connect: connectToServer,
|
|
1794
|
+
disconnect: disconnectFromServer,
|
|
1795
|
+
sendMessage: sendMessage,
|
|
1796
|
+
connection: connection
|
|
1797
|
+
};
|
|
1798
|
+
};
|
|
1799
|
+
|
|
1800
|
+
var QUEUE_STORAGE_KEY = 'message_queue';
|
|
1801
|
+
var MAX_RETRY_TIME = 60 * 1000;
|
|
1802
|
+
var DEFAULT_MAX_ATTEMPTS = 3;
|
|
1803
|
+
var RETRY_DELAY = 2000;
|
|
1804
|
+
var useQueue = function useQueue(api) {
|
|
1805
|
+
var _useState = React.useState([]),
|
|
1806
|
+
queue = _useState[0],
|
|
1807
|
+
setQueue = _useState[1];
|
|
1808
|
+
var _useState2 = React.useState(false),
|
|
1809
|
+
isProcessing = _useState2[0],
|
|
1810
|
+
setIsProcessing = _useState2[1];
|
|
1811
|
+
React.useEffect(function () {
|
|
1812
|
+
try {
|
|
1813
|
+
var storedQueue = localStorage.getItem(QUEUE_STORAGE_KEY);
|
|
1814
|
+
if (storedQueue) {
|
|
1815
|
+
var parsedQueue = JSON.parse(storedQueue);
|
|
1816
|
+
var now = Date.now();
|
|
1817
|
+
var validQueue = parsedQueue.filter(function (item) {
|
|
1818
|
+
return now - item.timestamp <= MAX_RETRY_TIME;
|
|
1819
|
+
});
|
|
1820
|
+
setQueue(validQueue);
|
|
1821
|
+
}
|
|
1822
|
+
} catch (error) {
|
|
1823
|
+
console.error('Failed to load message queue from localStorage:', error);
|
|
1824
|
+
}
|
|
1825
|
+
}, []);
|
|
1826
|
+
React.useEffect(function () {
|
|
1827
|
+
try {
|
|
1828
|
+
localStorage.setItem(QUEUE_STORAGE_KEY, JSON.stringify(queue));
|
|
1829
|
+
} catch (error) {
|
|
1830
|
+
console.error('Failed to save message queue to localStorage:', error);
|
|
1831
|
+
}
|
|
1832
|
+
}, [queue]);
|
|
1833
|
+
var enqueueMessage = React.useCallback(function (message) {
|
|
1834
|
+
var id = "msg_" + Date.now() + "_" + Math.random().toString(36).substr(2, 9);
|
|
1835
|
+
var queuedMessage = {
|
|
1836
|
+
id: id,
|
|
1837
|
+
message: message,
|
|
1838
|
+
attempts: 0,
|
|
1839
|
+
maxAttempts: DEFAULT_MAX_ATTEMPTS,
|
|
1840
|
+
timestamp: Date.now()
|
|
1841
|
+
};
|
|
1842
|
+
setQueue(function (prevQueue) {
|
|
1843
|
+
return [].concat(prevQueue, [queuedMessage]);
|
|
1844
|
+
});
|
|
1845
|
+
return id;
|
|
1846
|
+
}, []);
|
|
1847
|
+
var processQueue = React.useCallback(function () {
|
|
1848
|
+
try {
|
|
1849
|
+
if (!api || isProcessing || queue.length === 0) {
|
|
1850
|
+
return Promise.resolve();
|
|
1851
|
+
}
|
|
1852
|
+
setIsProcessing(true);
|
|
1853
|
+
var currentMessage = queue[0],
|
|
1854
|
+
remainingMessages = queue.slice(1);
|
|
1855
|
+
var now = Date.now();
|
|
1856
|
+
if (now - currentMessage.timestamp > MAX_RETRY_TIME) {
|
|
1857
|
+
setQueue(remainingMessages);
|
|
1858
|
+
setIsProcessing(false);
|
|
1859
|
+
return Promise.resolve();
|
|
1860
|
+
}
|
|
1861
|
+
var _temp = _finallyRethrows(function () {
|
|
1862
|
+
return _catch(function () {
|
|
1863
|
+
return Promise.resolve(api.sendMessage(currentMessage.message)).then(function () {
|
|
1864
|
+
setQueue(remainingMessages);
|
|
1865
|
+
});
|
|
1866
|
+
}, function () {
|
|
1867
|
+
if (currentMessage.attempts < currentMessage.maxAttempts) {
|
|
1868
|
+
var updatedMessage = _extends({}, currentMessage, {
|
|
1869
|
+
attempts: currentMessage.attempts + 1
|
|
1870
|
+
});
|
|
1871
|
+
setQueue([].concat(remainingMessages, [updatedMessage]));
|
|
1872
|
+
} else {
|
|
1873
|
+
setQueue(remainingMessages);
|
|
1874
|
+
}
|
|
1875
|
+
});
|
|
1876
|
+
}, function (_wasThrown, _result) {
|
|
1877
|
+
setIsProcessing(false);
|
|
1878
|
+
if (remainingMessages.length > 0) {
|
|
1879
|
+
setTimeout(function () {
|
|
1880
|
+
return processQueue();
|
|
1881
|
+
}, RETRY_DELAY);
|
|
1882
|
+
}
|
|
1883
|
+
if (_wasThrown) throw _result;
|
|
1884
|
+
return _result;
|
|
1885
|
+
});
|
|
1886
|
+
return Promise.resolve(_temp && _temp.then ? _temp.then(function () {}) : void 0);
|
|
1887
|
+
} catch (e) {
|
|
1888
|
+
return Promise.reject(e);
|
|
1889
|
+
}
|
|
1890
|
+
}, [api, isProcessing, queue]);
|
|
1891
|
+
React.useEffect(function () {
|
|
1892
|
+
if (queue.length > 0 && api && !isProcessing) {
|
|
1893
|
+
processQueue();
|
|
1894
|
+
}
|
|
1895
|
+
}, [queue, api, isProcessing, processQueue]);
|
|
1896
|
+
var sendMessageWithRetry = React.useCallback(function (message) {
|
|
1897
|
+
try {
|
|
1898
|
+
if (!api) {
|
|
1899
|
+
enqueueMessage(message);
|
|
1900
|
+
return Promise.resolve(null);
|
|
1901
|
+
}
|
|
1902
|
+
return Promise.resolve(_catch(function () {
|
|
1903
|
+
return Promise.resolve(api.sendMessage(message));
|
|
1904
|
+
}, function () {
|
|
1905
|
+
enqueueMessage(message);
|
|
1906
|
+
return null;
|
|
1907
|
+
}));
|
|
1908
|
+
} catch (e) {
|
|
1909
|
+
return Promise.reject(e);
|
|
1910
|
+
}
|
|
1911
|
+
}, [api, enqueueMessage]);
|
|
1912
|
+
return {
|
|
1913
|
+
enqueueMessage: enqueueMessage,
|
|
1914
|
+
sendMessageWithRetry: sendMessageWithRetry,
|
|
1915
|
+
queueLength: queue.length,
|
|
1916
|
+
isProcessing: isProcessing
|
|
1917
|
+
};
|
|
1918
|
+
};
|
|
1919
|
+
|
|
1920
|
+
var useClientProfile = function useClientProfile() {
|
|
1921
|
+
var _useChatContext = useChatContext(),
|
|
1922
|
+
api = _useChatContext.api;
|
|
1923
|
+
var _useState = React.useState(false),
|
|
1924
|
+
loading = _useState[0],
|
|
1925
|
+
setLoading = _useState[1];
|
|
1926
|
+
var _useState2 = React.useState(null),
|
|
1927
|
+
error = _useState2[0],
|
|
1928
|
+
setError = _useState2[1];
|
|
1929
|
+
var _useState3 = React.useState(null),
|
|
1930
|
+
profile = _useState3[0],
|
|
1931
|
+
setProfile = _useState3[1];
|
|
1932
|
+
var fetchProfile = React.useCallback(function () {
|
|
1933
|
+
try {
|
|
1934
|
+
if (!api) {
|
|
1935
|
+
setError(new Error('API not initialized'));
|
|
1936
|
+
return Promise.resolve(null);
|
|
1937
|
+
}
|
|
1938
|
+
setLoading(true);
|
|
1939
|
+
setError(null);
|
|
1940
|
+
return Promise.resolve(_finallyRethrows(function () {
|
|
1941
|
+
return _catch(function () {
|
|
1942
|
+
return Promise.resolve(api.getClientProfile()).then(function (response) {
|
|
1943
|
+
setProfile(response);
|
|
1944
|
+
return response;
|
|
1945
|
+
});
|
|
1946
|
+
}, function (err) {
|
|
1947
|
+
var error = err instanceof Error ? err : new Error('Failed to fetch client profile');
|
|
1948
|
+
setError(error);
|
|
1949
|
+
return null;
|
|
1950
|
+
});
|
|
1951
|
+
}, function (_wasThrown, _result) {
|
|
1952
|
+
setLoading(false);
|
|
1953
|
+
if (_wasThrown) throw _result;
|
|
1954
|
+
return _result;
|
|
1955
|
+
}));
|
|
1956
|
+
} catch (e) {
|
|
1957
|
+
return Promise.reject(e);
|
|
1958
|
+
}
|
|
1959
|
+
}, [api]);
|
|
1960
|
+
React.useEffect(function () {
|
|
1961
|
+
if (api) {
|
|
1962
|
+
fetchProfile();
|
|
1963
|
+
}
|
|
1964
|
+
}, [api, fetchProfile]);
|
|
1965
|
+
return {
|
|
1966
|
+
loading: loading,
|
|
1967
|
+
error: error,
|
|
1968
|
+
profile: profile,
|
|
1969
|
+
fetchProfile: fetchProfile
|
|
1970
|
+
};
|
|
1971
|
+
};
|
|
1972
|
+
|
|
1973
|
+
var useMessages = function useMessages(conversationUid) {
|
|
1974
|
+
var _useChatContext = useChatContext(),
|
|
1975
|
+
api = _useChatContext.api;
|
|
1976
|
+
var _useClientProfile = useClientProfile(),
|
|
1977
|
+
profile = _useClientProfile.profile;
|
|
1978
|
+
var _useState = React.useState(false),
|
|
1979
|
+
loading = _useState[0],
|
|
1980
|
+
setLoading = _useState[1];
|
|
1981
|
+
var _useState2 = React.useState(null),
|
|
1982
|
+
error = _useState2[0],
|
|
1983
|
+
setError = _useState2[1];
|
|
1984
|
+
var _useState3 = React.useState(null),
|
|
1985
|
+
messages = _useState3[0],
|
|
1986
|
+
setMessages = _useState3[1];
|
|
1987
|
+
var _useState4 = React.useState(null),
|
|
1988
|
+
preferences = _useState4[0],
|
|
1989
|
+
setPreferences = _useState4[1];
|
|
1990
|
+
var _useConnection = useConnection(),
|
|
1991
|
+
isConnected = _useConnection.isConnected,
|
|
1992
|
+
connection = _useConnection.connection;
|
|
1993
|
+
var _useQueue = useQueue(api),
|
|
1994
|
+
sendMessageWithRetry = _useQueue.sendMessageWithRetry,
|
|
1995
|
+
queueLength = _useQueue.queueLength;
|
|
1996
|
+
React.useEffect(function () {
|
|
1997
|
+
var fetchPreferences = function fetchPreferences() {
|
|
1998
|
+
try {
|
|
1999
|
+
if (!api) {
|
|
2000
|
+
setError(new Error('API not initialized'));
|
|
2001
|
+
return Promise.resolve();
|
|
2002
|
+
}
|
|
2003
|
+
var _temp = _catch(function () {
|
|
2004
|
+
return Promise.resolve(api.getClientPreferences()).then(function (response) {
|
|
2005
|
+
setPreferences(response.preferences);
|
|
2006
|
+
});
|
|
2007
|
+
}, function (err) {
|
|
2008
|
+
var error = err instanceof Error ? err : new Error('Failed to fetch preferences');
|
|
2009
|
+
setError(error);
|
|
2010
|
+
});
|
|
2011
|
+
return Promise.resolve(_temp && _temp.then ? _temp.then(function () {}) : void 0);
|
|
2012
|
+
} catch (e) {
|
|
2013
|
+
return Promise.reject(e);
|
|
2014
|
+
}
|
|
2015
|
+
};
|
|
2016
|
+
fetchPreferences();
|
|
2017
|
+
}, [api]);
|
|
2018
|
+
var clearDuplicateMessages = React.useCallback(function (messages) {
|
|
2019
|
+
var uniqueMessages = new Map();
|
|
2020
|
+
messages.forEach(function (message) {
|
|
2021
|
+
uniqueMessages.set(message.id, message);
|
|
2022
|
+
});
|
|
2023
|
+
return Array.from(uniqueMessages.values());
|
|
2024
|
+
}, []);
|
|
2025
|
+
var getMessages = React.useCallback(function (conversationId, page, pageSize) {
|
|
2026
|
+
if (conversationId === void 0) {
|
|
2027
|
+
conversationId = conversationUid;
|
|
2028
|
+
}
|
|
2029
|
+
if (page === void 0) {
|
|
2030
|
+
page = 1;
|
|
2031
|
+
}
|
|
2032
|
+
if (pageSize === void 0) {
|
|
2033
|
+
pageSize = 20;
|
|
2034
|
+
}
|
|
2035
|
+
try {
|
|
2036
|
+
if (!api) {
|
|
2037
|
+
setError(new Error('API not initialized'));
|
|
2038
|
+
return Promise.resolve(null);
|
|
2039
|
+
}
|
|
2040
|
+
if (!conversationId) {
|
|
2041
|
+
setError(new Error('Conversation ID is required'));
|
|
2042
|
+
return Promise.resolve(null);
|
|
2043
|
+
}
|
|
2044
|
+
setLoading(true);
|
|
2045
|
+
setError(null);
|
|
2046
|
+
return Promise.resolve(_finallyRethrows(function () {
|
|
2047
|
+
return _catch(function () {
|
|
2048
|
+
return Promise.resolve(api.getMessages(conversationId, page, pageSize)).then(function (response) {
|
|
2049
|
+
if (page === 1) setMessages(response);else setMessages(function (prev) {
|
|
2050
|
+
return prev ? _extends({}, prev, {
|
|
2051
|
+
messages: clearDuplicateMessages([].concat(prev.messages, response === null || response === void 0 ? void 0 : response.messages)),
|
|
2052
|
+
pagination: response.pagination
|
|
2053
|
+
}) : null;
|
|
2054
|
+
});
|
|
2055
|
+
return response;
|
|
2056
|
+
});
|
|
2057
|
+
}, function (err) {
|
|
2058
|
+
var error = err instanceof Error ? err : new Error('Failed to get messages');
|
|
2059
|
+
setError(error);
|
|
2060
|
+
return null;
|
|
2061
|
+
});
|
|
2062
|
+
}, function (_wasThrown, _result) {
|
|
2063
|
+
setLoading(false);
|
|
2064
|
+
if (_wasThrown) throw _result;
|
|
2065
|
+
return _result;
|
|
2066
|
+
}));
|
|
2067
|
+
} catch (e) {
|
|
2068
|
+
return Promise.reject(e);
|
|
2069
|
+
}
|
|
2070
|
+
}, [conversationUid]);
|
|
2071
|
+
var markMessageAsRead = React.useCallback(function (messageId) {
|
|
2072
|
+
try {
|
|
2073
|
+
if (!api) {
|
|
2074
|
+
setError(new Error('API not initialized'));
|
|
2075
|
+
return Promise.resolve(null);
|
|
2076
|
+
}
|
|
2077
|
+
setLoading(true);
|
|
2078
|
+
setError(null);
|
|
2079
|
+
return Promise.resolve(_finallyRethrows(function () {
|
|
2080
|
+
return _catch(function () {
|
|
2081
|
+
return Promise.resolve(api.markMessageAsRead(messageId));
|
|
2082
|
+
}, function (err) {
|
|
2083
|
+
var error = err instanceof Error ? err : new Error('Failed to mark message as read');
|
|
2084
|
+
setError(error);
|
|
2085
|
+
return null;
|
|
2086
|
+
});
|
|
2087
|
+
}, function (_wasThrown2, _result2) {
|
|
2088
|
+
setLoading(false);
|
|
2089
|
+
if (_wasThrown2) throw _result2;
|
|
2090
|
+
return _result2;
|
|
2091
|
+
}));
|
|
2092
|
+
} catch (e) {
|
|
2093
|
+
return Promise.reject(e);
|
|
2094
|
+
}
|
|
2095
|
+
}, []);
|
|
2096
|
+
var sendMessage = React.useCallback(function (message) {
|
|
2097
|
+
try {
|
|
2098
|
+
if (!api) {
|
|
2099
|
+
setError(new Error('API not initialized'));
|
|
2100
|
+
return Promise.resolve(null);
|
|
2101
|
+
}
|
|
2102
|
+
var messageWithConversation = _extends({}, message, {
|
|
2103
|
+
conversation_uid: message.conversation_uid || conversationUid
|
|
2104
|
+
});
|
|
2105
|
+
setLoading(true);
|
|
2106
|
+
setError(null);
|
|
2107
|
+
return Promise.resolve(_finallyRethrows(function () {
|
|
2108
|
+
return _catch(function () {
|
|
2109
|
+
return Promise.resolve(sendMessageWithRetry(messageWithConversation));
|
|
2110
|
+
}, function (err) {
|
|
2111
|
+
var error = err instanceof Error ? err : new Error('Failed to send message');
|
|
2112
|
+
setError(error);
|
|
2113
|
+
return null;
|
|
2114
|
+
});
|
|
2115
|
+
}, function (_wasThrown3, _result3) {
|
|
2116
|
+
setLoading(false);
|
|
2117
|
+
if (_wasThrown3) throw _result3;
|
|
2118
|
+
return _result3;
|
|
2119
|
+
}));
|
|
2120
|
+
} catch (e) {
|
|
2121
|
+
return Promise.reject(e);
|
|
2122
|
+
}
|
|
2123
|
+
}, [conversationUid, sendMessageWithRetry]);
|
|
2124
|
+
var markConversationAsRead = React.useCallback(function (conversationId) {
|
|
2125
|
+
if (conversationId === void 0) {
|
|
2126
|
+
conversationId = conversationUid;
|
|
2127
|
+
}
|
|
2128
|
+
try {
|
|
2129
|
+
if (!api) {
|
|
2130
|
+
setError(new Error('API not initialized'));
|
|
2131
|
+
return Promise.resolve(null);
|
|
2132
|
+
}
|
|
2133
|
+
if (!conversationId) {
|
|
2134
|
+
setError(new Error('Conversation ID is required'));
|
|
2135
|
+
return Promise.resolve(null);
|
|
2136
|
+
}
|
|
2137
|
+
setLoading(true);
|
|
2138
|
+
setError(null);
|
|
2139
|
+
return Promise.resolve(_finallyRethrows(function () {
|
|
2140
|
+
return _catch(function () {
|
|
2141
|
+
return Promise.resolve(api.markConversationAsRead(conversationId)).then(function (response) {
|
|
2142
|
+
setMessages(function (prev) {
|
|
2143
|
+
var _prev$messages;
|
|
2144
|
+
return prev ? _extends({}, prev, {
|
|
2145
|
+
messages: prev === null || prev === void 0 ? void 0 : (_prev$messages = prev.messages) === null || _prev$messages === void 0 ? void 0 : _prev$messages.map(function (item) {
|
|
2146
|
+
return _extends({}, item, {
|
|
2147
|
+
is_read: true
|
|
2148
|
+
});
|
|
2149
|
+
})
|
|
2150
|
+
}) : null;
|
|
2151
|
+
});
|
|
2152
|
+
return response;
|
|
2153
|
+
});
|
|
2154
|
+
}, function (err) {
|
|
2155
|
+
var error = err instanceof Error ? err : new Error('Failed to mark conversation as read');
|
|
2156
|
+
setError(error);
|
|
2157
|
+
return null;
|
|
2158
|
+
});
|
|
2159
|
+
}, function (_wasThrown4, _result4) {
|
|
2160
|
+
setLoading(false);
|
|
2161
|
+
if (_wasThrown4) throw _result4;
|
|
2162
|
+
return _result4;
|
|
2163
|
+
}));
|
|
2164
|
+
} catch (e) {
|
|
2165
|
+
return Promise.reject(e);
|
|
2166
|
+
}
|
|
2167
|
+
}, [api, conversationUid]);
|
|
2168
|
+
var updateMessage = React.useCallback(function (messageId, update) {
|
|
2169
|
+
try {
|
|
2170
|
+
if (!api) {
|
|
2171
|
+
setError(new Error('API not initialized'));
|
|
2172
|
+
return Promise.resolve(null);
|
|
2173
|
+
}
|
|
2174
|
+
setLoading(true);
|
|
2175
|
+
setError(null);
|
|
2176
|
+
return Promise.resolve(_finallyRethrows(function () {
|
|
2177
|
+
return _catch(function () {
|
|
2178
|
+
return Promise.resolve(api.updateMessage(messageId, update)).then(function (response) {
|
|
2179
|
+
setMessages(function (prev) {
|
|
2180
|
+
return prev ? _extends({}, prev, {
|
|
2181
|
+
messages: prev.messages.map(function (item) {
|
|
2182
|
+
return item.id === messageId ? _extends({}, item, response.message) : item;
|
|
2183
|
+
})
|
|
2184
|
+
}) : null;
|
|
2185
|
+
});
|
|
2186
|
+
return response;
|
|
2187
|
+
});
|
|
2188
|
+
}, function (err) {
|
|
2189
|
+
var error = err instanceof Error ? err : new Error('Failed to update message');
|
|
2190
|
+
setError(error);
|
|
2191
|
+
return null;
|
|
2192
|
+
});
|
|
2193
|
+
}, function (_wasThrown5, _result5) {
|
|
2194
|
+
setLoading(false);
|
|
2195
|
+
if (_wasThrown5) throw _result5;
|
|
2196
|
+
return _result5;
|
|
2197
|
+
}));
|
|
2198
|
+
} catch (e) {
|
|
2199
|
+
return Promise.reject(e);
|
|
2200
|
+
}
|
|
2201
|
+
}, [api, conversationUid]);
|
|
2202
|
+
var deleteMessage = React.useCallback(function (messageId) {
|
|
2203
|
+
try {
|
|
2204
|
+
if (!api) {
|
|
2205
|
+
setError(new Error('API not initialized'));
|
|
2206
|
+
return Promise.resolve(null);
|
|
2207
|
+
}
|
|
2208
|
+
setLoading(true);
|
|
2209
|
+
setError(null);
|
|
2210
|
+
return Promise.resolve(_finallyRethrows(function () {
|
|
2211
|
+
return _catch(function () {
|
|
2212
|
+
return Promise.resolve(api.deleteMessage(messageId)).then(function (response) {
|
|
2213
|
+
setMessages(function (prev) {
|
|
2214
|
+
return prev ? _extends({}, prev, {
|
|
2215
|
+
messages: prev.messages.filter(function (item) {
|
|
2216
|
+
return item.id !== messageId;
|
|
2217
|
+
})
|
|
2218
|
+
}) : null;
|
|
2219
|
+
});
|
|
2220
|
+
return response;
|
|
2221
|
+
});
|
|
2222
|
+
}, function (err) {
|
|
2223
|
+
var error = err instanceof Error ? err : new Error('Failed to delete message');
|
|
2224
|
+
setError(error);
|
|
2225
|
+
return null;
|
|
2226
|
+
});
|
|
2227
|
+
}, function (_wasThrown6, _result6) {
|
|
2228
|
+
setLoading(false);
|
|
2229
|
+
if (_wasThrown6) throw _result6;
|
|
2230
|
+
return _result6;
|
|
2231
|
+
}));
|
|
2232
|
+
} catch (e) {
|
|
2233
|
+
return Promise.reject(e);
|
|
2234
|
+
}
|
|
2235
|
+
}, [api, conversationUid]);
|
|
2236
|
+
var updatePreferences = React.useCallback(function (enableRead) {
|
|
2237
|
+
try {
|
|
2238
|
+
if (!api) {
|
|
2239
|
+
setError(new Error('API not initialized'));
|
|
2240
|
+
return Promise.resolve(false);
|
|
2241
|
+
}
|
|
2242
|
+
setError(null);
|
|
2243
|
+
return Promise.resolve(_catch(function () {
|
|
2244
|
+
return Promise.resolve(api.updateClientPreferences({
|
|
2245
|
+
preferences: {
|
|
2246
|
+
enable_read: enableRead
|
|
2247
|
+
}
|
|
2248
|
+
})).then(function (response) {
|
|
2249
|
+
setPreferences(response.preferences);
|
|
2250
|
+
return true;
|
|
2251
|
+
});
|
|
2252
|
+
}, function (err) {
|
|
2253
|
+
var error = err instanceof Error ? err : new Error('Failed to update preferences');
|
|
2254
|
+
setError(error);
|
|
2255
|
+
return false;
|
|
2256
|
+
}));
|
|
2257
|
+
} catch (e) {
|
|
2258
|
+
return Promise.reject(e);
|
|
2259
|
+
}
|
|
2260
|
+
}, [api]);
|
|
2261
|
+
React.useEffect(function () {
|
|
2262
|
+
if (conversationUid) {
|
|
2263
|
+
getMessages();
|
|
2264
|
+
}
|
|
2265
|
+
}, [isConnected, conversationUid]);
|
|
2266
|
+
var handleMessageEvent = React.useCallback(function (eventType, data) {
|
|
2267
|
+
if (!conversationUid || data.conversation_uid && data.conversation_uid !== conversationUid) {
|
|
2268
|
+
return;
|
|
2269
|
+
}
|
|
2270
|
+
setMessages(function (prev) {
|
|
2271
|
+
if (!prev) return prev;
|
|
2272
|
+
switch (eventType) {
|
|
2273
|
+
case exports.EventType.MessageSent:
|
|
2274
|
+
{
|
|
2275
|
+
var sentEvent = data;
|
|
2276
|
+
var messageExists = prev.messages.some(function (msg) {
|
|
2277
|
+
return msg.id === sentEvent.id;
|
|
2278
|
+
});
|
|
2279
|
+
if (messageExists) {
|
|
2280
|
+
return prev;
|
|
2281
|
+
}
|
|
2282
|
+
console.log('arrived event', eventType);
|
|
2283
|
+
return _extends({}, prev, {
|
|
2284
|
+
messages: [].concat(prev.messages, [sentEvent]).sort(function (a, b) {
|
|
2285
|
+
return new Date(b.sent_at).getTime() - new Date(a.sent_at).getTime();
|
|
2286
|
+
})
|
|
2287
|
+
});
|
|
2288
|
+
}
|
|
2289
|
+
case exports.EventType.MessageEdited:
|
|
2290
|
+
{
|
|
2291
|
+
var editEvent = data;
|
|
2292
|
+
return _extends({}, prev, {
|
|
2293
|
+
messages: prev.messages.map(function (msg) {
|
|
2294
|
+
return msg.id === editEvent.msg_id ? _extends({}, msg, {
|
|
2295
|
+
message: editEvent.new_content,
|
|
2296
|
+
attachments: editEvent.new_attachments || msg.attachments
|
|
2297
|
+
}) : msg;
|
|
2298
|
+
})
|
|
2299
|
+
});
|
|
2300
|
+
}
|
|
2301
|
+
case exports.EventType.MessageDeleted:
|
|
2302
|
+
{
|
|
2303
|
+
var deleteEvent = data;
|
|
2304
|
+
return _extends({}, prev, {
|
|
2305
|
+
messages: prev.messages.filter(function (msg) {
|
|
2306
|
+
return msg.id !== deleteEvent.msg_id;
|
|
2307
|
+
})
|
|
2308
|
+
});
|
|
2309
|
+
}
|
|
2310
|
+
case exports.EventType.MessageRead:
|
|
2311
|
+
{
|
|
2312
|
+
var readEvent = data;
|
|
2313
|
+
return _extends({}, prev, {
|
|
2314
|
+
messages: prev.messages.map(function (msg) {
|
|
2315
|
+
return msg.id === readEvent.message_id ? _extends({}, msg, {
|
|
2316
|
+
is_read: true
|
|
2317
|
+
}) : msg;
|
|
2318
|
+
})
|
|
2319
|
+
});
|
|
2320
|
+
}
|
|
2321
|
+
case exports.EventType.ConversationRead:
|
|
2322
|
+
{
|
|
2323
|
+
var conversationReadEvent = data;
|
|
2324
|
+
return _extends({}, prev, {
|
|
2325
|
+
messages: prev.messages.map(function (msg) {
|
|
2326
|
+
return conversationReadEvent.message_ids.includes(msg.id) ? _extends({}, msg, {
|
|
2327
|
+
is_read: true
|
|
2328
|
+
}) : msg;
|
|
2329
|
+
})
|
|
2330
|
+
});
|
|
2331
|
+
}
|
|
2332
|
+
default:
|
|
2333
|
+
return prev;
|
|
2334
|
+
}
|
|
2335
|
+
});
|
|
2336
|
+
}, [conversationUid, profile]);
|
|
2337
|
+
var sendReceivedEvent = React.useCallback(function (eventType, data) {
|
|
2338
|
+
if (eventType === exports.EventType.MessageSent) {
|
|
2339
|
+
var messageReceivedEvent = {
|
|
2340
|
+
type: exports.EventType.MessageReceived,
|
|
2341
|
+
data: data
|
|
2342
|
+
};
|
|
2343
|
+
connection.emit(messageReceivedEvent.type, messageReceivedEvent.data);
|
|
2344
|
+
}
|
|
2345
|
+
}, [connection]);
|
|
2346
|
+
var eventProcessorPipeline = React.useCallback(function (eventType, data) {
|
|
2347
|
+
markConversationAsRead(conversationUid);
|
|
2348
|
+
handleMessageEvent(eventType, data);
|
|
2349
|
+
}, [handleMessageEvent, conversationUid, sendReceivedEvent, preferences]);
|
|
2350
|
+
useAllMessageEvents(eventProcessorPipeline);
|
|
2351
|
+
return {
|
|
2352
|
+
messages: (messages === null || messages === void 0 ? void 0 : messages.messages) || [],
|
|
2353
|
+
pagination: messages === null || messages === void 0 ? void 0 : messages.pagination,
|
|
2354
|
+
loading: loading,
|
|
2355
|
+
error: error,
|
|
2356
|
+
queueLength: queueLength,
|
|
2357
|
+
getMessages: getMessages,
|
|
2358
|
+
markMessageAsRead: markMessageAsRead,
|
|
2359
|
+
sendMessage: sendMessage,
|
|
2360
|
+
markConversationAsRead: markConversationAsRead,
|
|
2361
|
+
updateMessage: updateMessage,
|
|
2362
|
+
deleteMessage: deleteMessage,
|
|
2363
|
+
setMessages: setMessages,
|
|
2364
|
+
updatePreferences: updatePreferences,
|
|
2365
|
+
preferences: preferences
|
|
2366
|
+
};
|
|
2367
|
+
};
|
|
2368
|
+
|
|
2369
|
+
var useFiles = function useFiles() {
|
|
2370
|
+
var _useChatContext = useChatContext(),
|
|
2371
|
+
api = _useChatContext.api;
|
|
2372
|
+
var _useState = React.useState(false),
|
|
2373
|
+
loading = _useState[0],
|
|
2374
|
+
setLoading = _useState[1];
|
|
2375
|
+
var _useState2 = React.useState(null),
|
|
2376
|
+
error = _useState2[0],
|
|
2377
|
+
setError = _useState2[1];
|
|
2378
|
+
var _useState3 = React.useState(0),
|
|
2379
|
+
uploadProgress = _useState3[0],
|
|
2380
|
+
setUploadProgress = _useState3[1];
|
|
2381
|
+
var uploadFile = React.useCallback(function (file) {
|
|
2382
|
+
try {
|
|
2383
|
+
if (!api) {
|
|
2384
|
+
setError(new Error('API not initialized'));
|
|
2385
|
+
return Promise.resolve(null);
|
|
2386
|
+
}
|
|
2387
|
+
setLoading(true);
|
|
2388
|
+
setError(null);
|
|
2389
|
+
setUploadProgress(0);
|
|
2390
|
+
return Promise.resolve(_finallyRethrows(function () {
|
|
2391
|
+
return _catch(function () {
|
|
2392
|
+
var simulateProgress = function simulateProgress() {
|
|
2393
|
+
var progress = 0;
|
|
2394
|
+
var interval = setInterval(function () {
|
|
2395
|
+
progress += 10;
|
|
2396
|
+
if (progress > 90) {
|
|
2397
|
+
clearInterval(interval);
|
|
2398
|
+
} else {
|
|
2399
|
+
setUploadProgress(progress);
|
|
2400
|
+
}
|
|
2401
|
+
}, 300);
|
|
2402
|
+
return function () {
|
|
2403
|
+
return clearInterval(interval);
|
|
2404
|
+
};
|
|
2405
|
+
};
|
|
2406
|
+
var cleanup = simulateProgress();
|
|
2407
|
+
return Promise.resolve(api.uploadFile(file)).then(function (response) {
|
|
2408
|
+
cleanup();
|
|
2409
|
+
setUploadProgress(100);
|
|
2410
|
+
return response;
|
|
2411
|
+
});
|
|
2412
|
+
}, function (err) {
|
|
2413
|
+
var error = err instanceof Error ? err : new Error('Failed to upload file');
|
|
2414
|
+
setError(error);
|
|
2415
|
+
return null;
|
|
2416
|
+
});
|
|
2417
|
+
}, function (_wasThrown, _result) {
|
|
2418
|
+
setLoading(false);
|
|
2419
|
+
if (_wasThrown) throw _result;
|
|
2420
|
+
return _result;
|
|
2421
|
+
}));
|
|
2422
|
+
} catch (e) {
|
|
2423
|
+
return Promise.reject(e);
|
|
2424
|
+
}
|
|
2425
|
+
}, [api]);
|
|
2426
|
+
return {
|
|
2427
|
+
loading: loading,
|
|
2428
|
+
error: error,
|
|
2429
|
+
uploadProgress: uploadProgress,
|
|
2430
|
+
uploadFile: uploadFile
|
|
2431
|
+
};
|
|
2432
|
+
};
|
|
2433
|
+
|
|
2434
|
+
var useConversationDetails = function useConversationDetails() {
|
|
2435
|
+
var _useChatContext = useChatContext(),
|
|
2436
|
+
api = _useChatContext.api;
|
|
2437
|
+
var _useState = React.useState(false),
|
|
2438
|
+
loading = _useState[0],
|
|
2439
|
+
setLoading = _useState[1];
|
|
2440
|
+
var _useState2 = React.useState(null),
|
|
2441
|
+
error = _useState2[0],
|
|
2442
|
+
setError = _useState2[1];
|
|
2443
|
+
var _useState3 = React.useState(null),
|
|
2444
|
+
conversationDetails = _useState3[0],
|
|
2445
|
+
setConversationDetails = _useState3[1];
|
|
2446
|
+
var _useState4 = React.useState(null),
|
|
2447
|
+
receiverId = _useState4[0],
|
|
2448
|
+
setReceiverId = _useState4[1];
|
|
2449
|
+
var getConversationWithReceiver = React.useCallback(function (receiverId) {
|
|
2450
|
+
try {
|
|
2451
|
+
if (!api) {
|
|
2452
|
+
setError(new Error('API not initialized'));
|
|
2453
|
+
return Promise.resolve({
|
|
2454
|
+
details: null,
|
|
2455
|
+
receiverId: receiverId
|
|
2456
|
+
});
|
|
2457
|
+
}
|
|
2458
|
+
setLoading(true);
|
|
2459
|
+
setError(null);
|
|
2460
|
+
return Promise.resolve(_finallyRethrows(function () {
|
|
2461
|
+
return _catch(function () {
|
|
2462
|
+
return Promise.resolve(api.getConversationWithReceiver(receiverId)).then(function (details) {
|
|
2463
|
+
setConversationDetails(details);
|
|
2464
|
+
setReceiverId(receiverId);
|
|
2465
|
+
return {
|
|
2466
|
+
details: details,
|
|
2467
|
+
receiverId: receiverId
|
|
2468
|
+
};
|
|
2469
|
+
});
|
|
2470
|
+
}, function (err) {
|
|
2471
|
+
var error = err instanceof Error ? err : new Error('Failed to get conversation details');
|
|
2472
|
+
setError(error);
|
|
2473
|
+
return {
|
|
2474
|
+
details: null,
|
|
2475
|
+
receiverId: receiverId
|
|
2476
|
+
};
|
|
2477
|
+
});
|
|
2478
|
+
}, function (_wasThrown, _result) {
|
|
2479
|
+
setLoading(false);
|
|
2480
|
+
if (_wasThrown) throw _result;
|
|
2481
|
+
return _result;
|
|
2482
|
+
}));
|
|
2483
|
+
} catch (e) {
|
|
2484
|
+
return Promise.reject(e);
|
|
2485
|
+
}
|
|
2486
|
+
}, [api]);
|
|
2487
|
+
return {
|
|
2488
|
+
conversationDetails: conversationDetails,
|
|
2489
|
+
receiverId: receiverId,
|
|
2490
|
+
loading: loading,
|
|
2491
|
+
error: error,
|
|
2492
|
+
getConversationWithReceiver: getConversationWithReceiver
|
|
2493
|
+
};
|
|
2494
|
+
};
|
|
2495
|
+
|
|
2496
|
+
function useConversationManagement() {
|
|
2497
|
+
var _useState = React.useState(''),
|
|
2498
|
+
selectedConversationId = _useState[0],
|
|
2499
|
+
setSelectedConversationId = _useState[1];
|
|
2500
|
+
var _useConversations = useConversations(),
|
|
2501
|
+
conversations = _useConversations.conversations,
|
|
2502
|
+
conversationsLoading = _useConversations.loading,
|
|
2503
|
+
getConversations = _useConversations.getConversations,
|
|
2504
|
+
deleteConversation = _useConversations.deleteConversation,
|
|
2505
|
+
unarchiveConversation = _useConversations.unarchiveConversation,
|
|
2506
|
+
archiveConversation = _useConversations.archiveConversation,
|
|
2507
|
+
setConversations = _useConversations.setConversations;
|
|
2508
|
+
var selectedConversation = React.useMemo(function () {
|
|
2509
|
+
return conversations.find(function (conversation) {
|
|
2510
|
+
return conversation.id === selectedConversationId;
|
|
2511
|
+
});
|
|
2512
|
+
}, [conversations, selectedConversationId]);
|
|
2513
|
+
React.useEffect(function () {
|
|
2514
|
+
getConversations();
|
|
2515
|
+
}, [getConversations]);
|
|
2516
|
+
var handleSelectConversation = React.useCallback(function (conversation) {
|
|
2517
|
+
if (conversation === null) {
|
|
2518
|
+
setSelectedConversationId('');
|
|
2519
|
+
return;
|
|
2520
|
+
}
|
|
2521
|
+
setSelectedConversationId(conversation.id);
|
|
2522
|
+
setConversations(function (prevState) {
|
|
2523
|
+
return prevState.map(function (item) {
|
|
2524
|
+
return item.id === conversation.id ? _extends({}, conversation, {
|
|
2525
|
+
unreadCount: 0
|
|
2526
|
+
}) : item;
|
|
2527
|
+
});
|
|
2528
|
+
});
|
|
2529
|
+
}, [setConversations]);
|
|
2530
|
+
return {
|
|
2531
|
+
conversations: conversations,
|
|
2532
|
+
conversationsLoading: conversationsLoading,
|
|
2533
|
+
selectedConversationId: selectedConversationId,
|
|
2534
|
+
selectedConversation: selectedConversation,
|
|
2535
|
+
deleteConversation: deleteConversation,
|
|
2536
|
+
archiveConversation: archiveConversation,
|
|
2537
|
+
unarchiveConversation: unarchiveConversation,
|
|
2538
|
+
handleSelectConversation: handleSelectConversation,
|
|
2539
|
+
getConversations: getConversations
|
|
2540
|
+
};
|
|
2541
|
+
}
|
|
2542
|
+
|
|
2543
|
+
var useBans = function useBans() {
|
|
2544
|
+
var _useChatContext = useChatContext(),
|
|
2545
|
+
api = _useChatContext.api;
|
|
2546
|
+
var _useState = React.useState(false),
|
|
2547
|
+
loading = _useState[0],
|
|
2548
|
+
setLoading = _useState[1];
|
|
2549
|
+
var _useState2 = React.useState(null),
|
|
2550
|
+
error = _useState2[0],
|
|
2551
|
+
setError = _useState2[1];
|
|
2552
|
+
var _useState3 = React.useState(null),
|
|
2553
|
+
banStatus = _useState3[0],
|
|
2554
|
+
setBanStatus = _useState3[1];
|
|
2555
|
+
var banClient = React.useCallback(function (clientId) {
|
|
2556
|
+
try {
|
|
2557
|
+
if (!api) {
|
|
2558
|
+
setError(new Error('API not initialized'));
|
|
2559
|
+
return Promise.resolve(null);
|
|
2560
|
+
}
|
|
2561
|
+
setLoading(true);
|
|
2562
|
+
setError(null);
|
|
2563
|
+
return Promise.resolve(_finallyRethrows(function () {
|
|
2564
|
+
return _catch(function () {
|
|
2565
|
+
var request = {
|
|
2566
|
+
client_id: clientId
|
|
2567
|
+
};
|
|
2568
|
+
return Promise.resolve(api.banClient(request));
|
|
2569
|
+
}, function (err) {
|
|
2570
|
+
var error = err instanceof Error ? err : new Error('Failed to ban client');
|
|
2571
|
+
setError(error);
|
|
2572
|
+
return null;
|
|
2573
|
+
});
|
|
2574
|
+
}, function (_wasThrown, _result) {
|
|
2575
|
+
setLoading(false);
|
|
2576
|
+
if (_wasThrown) throw _result;
|
|
2577
|
+
return _result;
|
|
2578
|
+
}));
|
|
2579
|
+
} catch (e) {
|
|
2580
|
+
return Promise.reject(e);
|
|
2581
|
+
}
|
|
2582
|
+
}, [api]);
|
|
2583
|
+
var unbanClient = React.useCallback(function (clientId) {
|
|
2584
|
+
try {
|
|
2585
|
+
if (!api) {
|
|
2586
|
+
setError(new Error('API not initialized'));
|
|
2587
|
+
return Promise.resolve(null);
|
|
2588
|
+
}
|
|
2589
|
+
setLoading(true);
|
|
2590
|
+
setError(null);
|
|
2591
|
+
return Promise.resolve(_finallyRethrows(function () {
|
|
2592
|
+
return _catch(function () {
|
|
2593
|
+
var request = {
|
|
2594
|
+
client_id: clientId
|
|
2595
|
+
};
|
|
2596
|
+
return Promise.resolve(api.unbanClient(request));
|
|
2597
|
+
}, function (err) {
|
|
2598
|
+
var error = err instanceof Error ? err : new Error('Failed to unban client');
|
|
2599
|
+
setError(error);
|
|
2600
|
+
return null;
|
|
2601
|
+
});
|
|
2602
|
+
}, function (_wasThrown2, _result2) {
|
|
2603
|
+
setLoading(false);
|
|
2604
|
+
if (_wasThrown2) throw _result2;
|
|
2605
|
+
return _result2;
|
|
2606
|
+
}));
|
|
2607
|
+
} catch (e) {
|
|
2608
|
+
return Promise.reject(e);
|
|
2609
|
+
}
|
|
2610
|
+
}, [api]);
|
|
2611
|
+
var adminBanClient = React.useCallback(function (clientId, reason, durationDays) {
|
|
2612
|
+
try {
|
|
2613
|
+
if (!api) {
|
|
2614
|
+
setError(new Error('API not initialized'));
|
|
2615
|
+
return Promise.resolve(null);
|
|
2616
|
+
}
|
|
2617
|
+
setLoading(true);
|
|
2618
|
+
setError(null);
|
|
2619
|
+
return Promise.resolve(_finallyRethrows(function () {
|
|
2620
|
+
return _catch(function () {
|
|
2621
|
+
var request = {
|
|
2622
|
+
client_id: clientId,
|
|
2623
|
+
reason: reason,
|
|
2624
|
+
duration_days: durationDays
|
|
2625
|
+
};
|
|
2626
|
+
return Promise.resolve(api.adminBanClient(request));
|
|
2627
|
+
}, function (err) {
|
|
2628
|
+
var error = err instanceof Error ? err : new Error('Failed to admin ban client');
|
|
2629
|
+
setError(error);
|
|
2630
|
+
return null;
|
|
2631
|
+
});
|
|
2632
|
+
}, function (_wasThrown3, _result3) {
|
|
2633
|
+
setLoading(false);
|
|
2634
|
+
if (_wasThrown3) throw _result3;
|
|
2635
|
+
return _result3;
|
|
2636
|
+
}));
|
|
2637
|
+
} catch (e) {
|
|
2638
|
+
return Promise.reject(e);
|
|
2639
|
+
}
|
|
2640
|
+
}, [api]);
|
|
2641
|
+
var adminUnbanClient = React.useCallback(function (clientId) {
|
|
2642
|
+
try {
|
|
2643
|
+
if (!api) {
|
|
2644
|
+
setError(new Error('API not initialized'));
|
|
2645
|
+
return Promise.resolve(null);
|
|
2646
|
+
}
|
|
2647
|
+
setLoading(true);
|
|
2648
|
+
setError(null);
|
|
2649
|
+
return Promise.resolve(_finallyRethrows(function () {
|
|
2650
|
+
return _catch(function () {
|
|
2651
|
+
var request = {
|
|
2652
|
+
client_id: clientId
|
|
2653
|
+
};
|
|
2654
|
+
return Promise.resolve(api.adminUnbanClient(request));
|
|
2655
|
+
}, function (err) {
|
|
2656
|
+
var error = err instanceof Error ? err : new Error('Failed to admin unban client');
|
|
2657
|
+
setError(error);
|
|
2658
|
+
return null;
|
|
2659
|
+
});
|
|
2660
|
+
}, function (_wasThrown4, _result4) {
|
|
2661
|
+
setLoading(false);
|
|
2662
|
+
if (_wasThrown4) throw _result4;
|
|
2663
|
+
return _result4;
|
|
2664
|
+
}));
|
|
2665
|
+
} catch (e) {
|
|
2666
|
+
return Promise.reject(e);
|
|
2667
|
+
}
|
|
2668
|
+
}, [api]);
|
|
2669
|
+
var checkBanStatus = React.useCallback(function (clientId) {
|
|
2670
|
+
try {
|
|
2671
|
+
if (!api) {
|
|
2672
|
+
setError(new Error('API not initialized'));
|
|
2673
|
+
return Promise.resolve(null);
|
|
2674
|
+
}
|
|
2675
|
+
setLoading(true);
|
|
2676
|
+
setError(null);
|
|
2677
|
+
return Promise.resolve(_finallyRethrows(function () {
|
|
2678
|
+
return _catch(function () {
|
|
2679
|
+
return Promise.resolve(api.checkBanStatus(clientId)).then(function (response) {
|
|
2680
|
+
setBanStatus(response);
|
|
2681
|
+
return response;
|
|
2682
|
+
});
|
|
2683
|
+
}, function (err) {
|
|
2684
|
+
var error = err instanceof Error ? err : new Error('Failed to check ban status');
|
|
2685
|
+
setError(error);
|
|
2686
|
+
return null;
|
|
2687
|
+
});
|
|
2688
|
+
}, function (_wasThrown5, _result5) {
|
|
2689
|
+
setLoading(false);
|
|
2690
|
+
if (_wasThrown5) throw _result5;
|
|
2691
|
+
return _result5;
|
|
2692
|
+
}));
|
|
2693
|
+
} catch (e) {
|
|
2694
|
+
return Promise.reject(e);
|
|
2695
|
+
}
|
|
2696
|
+
}, [api]);
|
|
2697
|
+
return {
|
|
2698
|
+
loading: loading,
|
|
2699
|
+
error: error,
|
|
2700
|
+
banStatus: banStatus,
|
|
2701
|
+
banClient: banClient,
|
|
2702
|
+
unbanClient: unbanClient,
|
|
2703
|
+
adminBanClient: adminBanClient,
|
|
2704
|
+
adminUnbanClient: adminUnbanClient,
|
|
2705
|
+
checkBanStatus: checkBanStatus
|
|
2706
|
+
};
|
|
2707
|
+
};
|
|
2708
|
+
|
|
2709
|
+
function useMessageManagement(selectedConversationId) {
|
|
2710
|
+
var _useState = React.useState(1),
|
|
2711
|
+
page = _useState[0],
|
|
2712
|
+
setPage = _useState[1];
|
|
2713
|
+
var _useState2 = React.useState(true),
|
|
2714
|
+
hasMore = _useState2[0],
|
|
2715
|
+
setHasMore = _useState2[1];
|
|
2716
|
+
var _useClientProfile = useClientProfile(),
|
|
2717
|
+
profile = _useClientProfile.profile;
|
|
2718
|
+
var _useMessages = useMessages(selectedConversationId),
|
|
2719
|
+
messages = _useMessages.messages,
|
|
2720
|
+
messagesLoading = _useMessages.loading,
|
|
2721
|
+
sendMessage = _useMessages.sendMessage,
|
|
2722
|
+
getMessages = _useMessages.getMessages,
|
|
2723
|
+
markConversationAsRead = _useMessages.markConversationAsRead,
|
|
2724
|
+
deleteMessage = _useMessages.deleteMessage,
|
|
2725
|
+
updateMessage = _useMessages.updateMessage,
|
|
2726
|
+
setMessages = _useMessages.setMessages,
|
|
2727
|
+
preferences = _useMessages.preferences,
|
|
2728
|
+
updatePreferences = _useMessages.updatePreferences;
|
|
2729
|
+
var _useAllMessageEvents = useAllMessageEvents$1(),
|
|
2730
|
+
messageSent = _useAllMessageEvents.messageSent,
|
|
2731
|
+
messageEdited = _useAllMessageEvents.messageEdited,
|
|
2732
|
+
messageDeleted = _useAllMessageEvents.messageDeleted,
|
|
2733
|
+
clearEvents = _useAllMessageEvents.clearEvents;
|
|
2734
|
+
var _useFiles = useFiles(),
|
|
2735
|
+
uploadFile = _useFiles.uploadFile,
|
|
2736
|
+
fileLoading = _useFiles.loading,
|
|
2737
|
+
uploadProgress = _useFiles.uploadProgress;
|
|
2738
|
+
React.useEffect(function () {
|
|
2739
|
+
setPage(1);
|
|
2740
|
+
setHasMore(true);
|
|
2741
|
+
}, [selectedConversationId]);
|
|
2742
|
+
React.useEffect(function () {
|
|
2743
|
+
if (selectedConversationId) {
|
|
2744
|
+
markConversationAsRead();
|
|
2745
|
+
}
|
|
2746
|
+
}, [selectedConversationId, markConversationAsRead]);
|
|
2747
|
+
React.useEffect(function () {
|
|
2748
|
+
if (messageSent || messageEdited || messageDeleted) {
|
|
2749
|
+
clearEvents();
|
|
2750
|
+
}
|
|
2751
|
+
}, [messageSent, messageEdited, messageDeleted, clearEvents]);
|
|
2752
|
+
var loadMoreMessages = React.useCallback(function () {
|
|
2753
|
+
try {
|
|
2754
|
+
if (messagesLoading || !hasMore) return Promise.resolve();
|
|
2755
|
+
var _temp = _catch(function () {
|
|
2756
|
+
var nextPage = page + 1;
|
|
2757
|
+
return Promise.resolve(getMessages(selectedConversationId, nextPage)).then(function (result) {
|
|
2758
|
+
if (!result || result.messages.length === 0) {
|
|
2759
|
+
setHasMore(false);
|
|
2760
|
+
} else {
|
|
2761
|
+
setPage(nextPage);
|
|
2762
|
+
}
|
|
2763
|
+
});
|
|
2764
|
+
}, function (error) {
|
|
2765
|
+
console.error('Failed to load more messages:', error);
|
|
2766
|
+
setHasMore(false);
|
|
2767
|
+
});
|
|
2768
|
+
return Promise.resolve(_temp && _temp.then ? _temp.then(function () {}) : void 0);
|
|
2769
|
+
} catch (e) {
|
|
2770
|
+
return Promise.reject(e);
|
|
2771
|
+
}
|
|
2772
|
+
}, [messagesLoading, hasMore, getMessages, page, selectedConversationId]);
|
|
2773
|
+
var handleSendMessage = React.useCallback(function (content, receiver) {
|
|
2774
|
+
try {
|
|
2775
|
+
if (!content.trim() || !selectedConversationId || !profile) return Promise.resolve();
|
|
2776
|
+
var tempMessageId = "temp-" + Date.now();
|
|
2777
|
+
var newMessage = {
|
|
2778
|
+
attachments: [],
|
|
2779
|
+
conversation_uid: tempMessageId,
|
|
2780
|
+
sent_at: new Date().toISOString().replace('Z', '000'),
|
|
2781
|
+
message: content.trim(),
|
|
2782
|
+
messageType: 0,
|
|
2783
|
+
sender: profile,
|
|
2784
|
+
receiver: receiver,
|
|
2785
|
+
is_read: false,
|
|
2786
|
+
status: 'sending'
|
|
2787
|
+
};
|
|
2788
|
+
setMessages(function (prevMessages) {
|
|
2789
|
+
var prevMessageArray = (prevMessages === null || prevMessages === void 0 ? void 0 : prevMessages.messages) || [];
|
|
2790
|
+
return _extends({}, prevMessages, {
|
|
2791
|
+
messages: [newMessage].concat(prevMessageArray)
|
|
2792
|
+
});
|
|
2793
|
+
});
|
|
2794
|
+
return Promise.resolve(_catch(function () {
|
|
2795
|
+
return Promise.resolve(sendMessage({
|
|
2796
|
+
receiver_client_id: receiver.id,
|
|
2797
|
+
content: content,
|
|
2798
|
+
conversation_uid: selectedConversationId
|
|
2799
|
+
})).then(function (success) {
|
|
2800
|
+
if (!success) {
|
|
2801
|
+
setMessages(function (prevMessages) {
|
|
2802
|
+
return _extends({}, prevMessages, {
|
|
2803
|
+
messages: ((prevMessages === null || prevMessages === void 0 ? void 0 : prevMessages.messages) || []).map(function (msg) {
|
|
2804
|
+
return msg.conversation_uid === tempMessageId ? _extends({}, msg, {
|
|
2805
|
+
status: 'failed'
|
|
2806
|
+
}) : msg;
|
|
2807
|
+
})
|
|
2808
|
+
});
|
|
2809
|
+
});
|
|
2810
|
+
return false;
|
|
2811
|
+
} else {
|
|
2812
|
+
setMessages(function (prevMessages) {
|
|
2813
|
+
return _extends({}, prevMessages, {
|
|
2814
|
+
messages: ((prevMessages === null || prevMessages === void 0 ? void 0 : prevMessages.messages) || []).map(function (msg) {
|
|
2815
|
+
return msg.conversation_uid === tempMessageId ? _extends({}, msg, {
|
|
2816
|
+
status: 'sent',
|
|
2817
|
+
id: success.message.id,
|
|
2818
|
+
is_read: success.message.is_read
|
|
2819
|
+
}) : msg;
|
|
2820
|
+
})
|
|
2821
|
+
});
|
|
2822
|
+
});
|
|
2823
|
+
return true;
|
|
2824
|
+
}
|
|
2825
|
+
});
|
|
2826
|
+
}, function (error) {
|
|
2827
|
+
setMessages(function (prevMessages) {
|
|
2828
|
+
return _extends({}, prevMessages, {
|
|
2829
|
+
messages: ((prevMessages === null || prevMessages === void 0 ? void 0 : prevMessages.messages) || []).filter(function (msg) {
|
|
2830
|
+
return msg.conversation_uid !== tempMessageId;
|
|
2831
|
+
})
|
|
2832
|
+
});
|
|
2833
|
+
});
|
|
2834
|
+
console.error('Failed to send message:', error);
|
|
2835
|
+
return false;
|
|
2836
|
+
}));
|
|
2837
|
+
} catch (e) {
|
|
2838
|
+
return Promise.reject(e);
|
|
2839
|
+
}
|
|
2840
|
+
}, [sendMessage, selectedConversationId, profile === null || profile === void 0 ? void 0 : profile.id, setMessages]);
|
|
2841
|
+
var handleSendFileMessage = React.useCallback(function (content, fileId, receiver, filename, url) {
|
|
2842
|
+
try {
|
|
2843
|
+
if (!selectedConversationId) return Promise.resolve();
|
|
2844
|
+
var tempMessageId = "temp-file-" + Date.now();
|
|
2845
|
+
var newMessage = {
|
|
2846
|
+
attachments: [{
|
|
2847
|
+
filename: filename,
|
|
2848
|
+
url: url,
|
|
2849
|
+
id: fileId
|
|
2850
|
+
}],
|
|
2851
|
+
conversation_uid: tempMessageId,
|
|
2852
|
+
sent_at: new Date().toISOString().replace('Z', '000'),
|
|
2853
|
+
message: content,
|
|
2854
|
+
messageType: 0,
|
|
2855
|
+
sender: profile,
|
|
2856
|
+
receiver: receiver,
|
|
2857
|
+
is_read: false,
|
|
2858
|
+
status: 'sending'
|
|
2859
|
+
};
|
|
2860
|
+
setMessages(function (prevMessages) {
|
|
2861
|
+
var prevMessageArray = (prevMessages === null || prevMessages === void 0 ? void 0 : prevMessages.messages) || [];
|
|
2862
|
+
return _extends({}, prevMessages, {
|
|
2863
|
+
messages: [newMessage].concat(prevMessageArray)
|
|
2864
|
+
});
|
|
2865
|
+
});
|
|
2866
|
+
return Promise.resolve(_catch(function () {
|
|
2867
|
+
return Promise.resolve(sendMessage({
|
|
2868
|
+
receiver_client_id: receiver.id,
|
|
2869
|
+
content: content,
|
|
2870
|
+
attachments: [fileId],
|
|
2871
|
+
conversation_uid: selectedConversationId
|
|
2872
|
+
})).then(function (success) {
|
|
2873
|
+
if (success) {
|
|
2874
|
+
setMessages(function (prevMessages) {
|
|
2875
|
+
return _extends({}, prevMessages, {
|
|
2876
|
+
messages: ((prevMessages === null || prevMessages === void 0 ? void 0 : prevMessages.messages) || []).map(function (msg) {
|
|
2877
|
+
return msg.conversation_uid === tempMessageId ? _extends({}, msg, {
|
|
2878
|
+
status: 'sent',
|
|
2879
|
+
id: success.message.id,
|
|
2880
|
+
is_read: success.message.is_read
|
|
2881
|
+
}) : msg;
|
|
2882
|
+
})
|
|
2883
|
+
});
|
|
2884
|
+
});
|
|
2885
|
+
return true;
|
|
2886
|
+
} else {
|
|
2887
|
+
setMessages(function (prevMessages) {
|
|
2888
|
+
return _extends({}, prevMessages, {
|
|
2889
|
+
messages: ((prevMessages === null || prevMessages === void 0 ? void 0 : prevMessages.messages) || []).map(function (msg) {
|
|
2890
|
+
return msg.conversation_uid === tempMessageId ? _extends({}, msg, {
|
|
2891
|
+
status: 'failed'
|
|
2892
|
+
}) : msg;
|
|
2893
|
+
})
|
|
2894
|
+
});
|
|
2895
|
+
});
|
|
2896
|
+
return false;
|
|
2897
|
+
}
|
|
2898
|
+
});
|
|
2899
|
+
}, function (error) {
|
|
2900
|
+
setMessages(function (prevMessages) {
|
|
2901
|
+
return _extends({}, prevMessages, {
|
|
2902
|
+
messages: ((prevMessages === null || prevMessages === void 0 ? void 0 : prevMessages.messages) || []).filter(function (msg) {
|
|
2903
|
+
return msg.conversation_uid !== tempMessageId;
|
|
2904
|
+
})
|
|
2905
|
+
});
|
|
2906
|
+
});
|
|
2907
|
+
console.error('Failed to send file message:', error);
|
|
2908
|
+
return false;
|
|
2909
|
+
}));
|
|
2910
|
+
} catch (e) {
|
|
2911
|
+
return Promise.reject(e);
|
|
2912
|
+
}
|
|
2913
|
+
}, [sendMessage, selectedConversationId, profile === null || profile === void 0 ? void 0 : profile.id, setMessages]);
|
|
2914
|
+
return {
|
|
2915
|
+
messages: messages,
|
|
2916
|
+
messagesLoading: messagesLoading,
|
|
2917
|
+
fileLoading: fileLoading,
|
|
2918
|
+
uploadProgress: uploadProgress,
|
|
2919
|
+
uploadFile: uploadFile,
|
|
2920
|
+
handleSendMessage: handleSendMessage,
|
|
2921
|
+
handleSendFileMessage: handleSendFileMessage,
|
|
2922
|
+
deleteMessage: deleteMessage,
|
|
2923
|
+
updateMessage: updateMessage,
|
|
2924
|
+
getMessages: getMessages,
|
|
2925
|
+
loadMoreMessages: loadMoreMessages,
|
|
2926
|
+
hasMore: hasMore,
|
|
2927
|
+
setMessages: setMessages,
|
|
2928
|
+
preferences: preferences,
|
|
2929
|
+
updatePreferences: updatePreferences
|
|
2930
|
+
};
|
|
2931
|
+
}
|
|
2932
|
+
|
|
2933
|
+
function useCustomEvents() {
|
|
2934
|
+
var _useConnectionContext = useConnectionContext(),
|
|
2935
|
+
on = _useConnectionContext.on,
|
|
2936
|
+
off = _useConnectionContext.off,
|
|
2937
|
+
connection = _useConnectionContext.connection;
|
|
2938
|
+
var customEventsRef = React.useRef(new Map());
|
|
2939
|
+
var registerCustomEventListener = React.useCallback(function (key, eventType, callback) {
|
|
2940
|
+
if (!customEventsRef.current.has(key)) {
|
|
2941
|
+
customEventsRef.current.set(key, []);
|
|
2942
|
+
}
|
|
2943
|
+
customEventsRef.current.get(key).push(callback);
|
|
2944
|
+
var eventHandler = function eventHandler(event) {
|
|
2945
|
+
var listeners = customEventsRef.current.get(key);
|
|
2946
|
+
if (listeners) {
|
|
2947
|
+
listeners.forEach(function (listener) {
|
|
2948
|
+
try {
|
|
2949
|
+
listener(event.data);
|
|
2950
|
+
} catch (err) {
|
|
2951
|
+
console.error("Error in custom event listener " + key + ":", err);
|
|
2952
|
+
}
|
|
2953
|
+
});
|
|
2954
|
+
}
|
|
2955
|
+
};
|
|
2956
|
+
on(eventType, eventHandler);
|
|
2957
|
+
return function () {
|
|
2958
|
+
var listeners = customEventsRef.current.get(key);
|
|
2959
|
+
if (listeners) {
|
|
2960
|
+
var index = listeners.indexOf(callback);
|
|
2961
|
+
if (index !== -1) {
|
|
2962
|
+
listeners.splice(index, 1);
|
|
2963
|
+
}
|
|
2964
|
+
}
|
|
2965
|
+
off(eventType, eventHandler);
|
|
2966
|
+
};
|
|
2967
|
+
}, [on, off]);
|
|
2968
|
+
var unregisterCustomEventListener = React.useCallback(function (key, callback) {
|
|
2969
|
+
var listeners = customEventsRef.current.get(key);
|
|
2970
|
+
if (listeners) {
|
|
2971
|
+
var index = listeners.indexOf(callback);
|
|
2972
|
+
if (index !== -1) {
|
|
2973
|
+
listeners.splice(index, 1);
|
|
2974
|
+
}
|
|
2975
|
+
}
|
|
2976
|
+
}, []);
|
|
2977
|
+
var unregisterAllCustomEventListeners = React.useCallback(function (key) {
|
|
2978
|
+
customEventsRef.current["delete"](key);
|
|
2979
|
+
}, []);
|
|
2980
|
+
var emitCustomEvent = React.useCallback(function (eventType, data) {
|
|
2981
|
+
if (connection) {
|
|
2982
|
+
connection.emit(eventType, data);
|
|
2983
|
+
}
|
|
2984
|
+
}, [connection]);
|
|
2985
|
+
return {
|
|
2986
|
+
registerCustomEventListener: registerCustomEventListener,
|
|
2987
|
+
unregisterCustomEventListener: unregisterCustomEventListener,
|
|
2988
|
+
unregisterAllCustomEventListeners: unregisterAllCustomEventListeners,
|
|
2989
|
+
emitCustomEvent: emitCustomEvent
|
|
2990
|
+
};
|
|
2991
|
+
}
|
|
2992
|
+
|
|
2993
|
+
function useLogging() {
|
|
2994
|
+
var _useConnectionContext = useConnectionContext(),
|
|
2995
|
+
updateLogging = _useConnectionContext.updateLogging,
|
|
2996
|
+
getLoggingConfig = _useConnectionContext.getLoggingConfig;
|
|
2997
|
+
var enableLogging = React.useCallback(function (level) {
|
|
2998
|
+
if (level === void 0) {
|
|
2999
|
+
level = exports.LogLevel.INFO;
|
|
3000
|
+
}
|
|
3001
|
+
updateLogging({
|
|
3002
|
+
enabled: true,
|
|
3003
|
+
level: level
|
|
3004
|
+
});
|
|
3005
|
+
}, [updateLogging]);
|
|
3006
|
+
var disableLogging = React.useCallback(function () {
|
|
3007
|
+
updateLogging({
|
|
3008
|
+
enabled: false
|
|
3009
|
+
});
|
|
3010
|
+
}, [updateLogging]);
|
|
3011
|
+
var setLogLevel = React.useCallback(function (level) {
|
|
3012
|
+
updateLogging({
|
|
3013
|
+
level: level
|
|
3014
|
+
});
|
|
3015
|
+
}, [updateLogging]);
|
|
3016
|
+
var updateLoggingConfig = React.useCallback(function (config) {
|
|
3017
|
+
updateLogging(config);
|
|
3018
|
+
}, [updateLogging]);
|
|
3019
|
+
return {
|
|
3020
|
+
enableLogging: enableLogging,
|
|
3021
|
+
disableLogging: disableLogging,
|
|
3022
|
+
setLogLevel: setLogLevel,
|
|
3023
|
+
updateLoggingConfig: updateLoggingConfig,
|
|
3024
|
+
getLoggingConfig: getLoggingConfig
|
|
3025
|
+
};
|
|
3026
|
+
}
|
|
3027
|
+
|
|
3028
|
+
var useAllMessageEvents$1 = useAllMessageEvents;
|
|
3029
|
+
var ChatClient = function ChatClient(_ref) {
|
|
3030
|
+
var children = _ref.children,
|
|
3031
|
+
token = _ref.token,
|
|
3032
|
+
client_id = _ref.client_id,
|
|
3033
|
+
_ref$baseUrl = _ref.baseUrl,
|
|
3034
|
+
baseUrl = _ref$baseUrl === void 0 ? 'https://api.example.com' : _ref$baseUrl,
|
|
3035
|
+
_ref$socketBaseUrl = _ref.socketBaseUrl,
|
|
3036
|
+
socketBaseUrl = _ref$socketBaseUrl === void 0 ? 'wss://api.example.com' : _ref$socketBaseUrl,
|
|
3037
|
+
connectionOptions = _ref.connectionOptions;
|
|
3038
|
+
var config = React.useMemo(function () {
|
|
3039
|
+
if (token) {
|
|
3040
|
+
return {
|
|
3041
|
+
token: token,
|
|
3042
|
+
baseUrl: baseUrl,
|
|
3043
|
+
client_id: client_id,
|
|
3044
|
+
socketBaseUrl: socketBaseUrl
|
|
3045
|
+
};
|
|
3046
|
+
}
|
|
3047
|
+
return undefined;
|
|
3048
|
+
}, [token, baseUrl, client_id]);
|
|
3049
|
+
return React.createElement(ChatProvider, {
|
|
3050
|
+
config: config,
|
|
3051
|
+
connectionOptions: connectionOptions
|
|
3052
|
+
}, children);
|
|
3053
|
+
};
|
|
3054
|
+
|
|
3055
|
+
exports.ChatApi = ChatApi;
|
|
3056
|
+
exports.ChatClient = ChatClient;
|
|
3057
|
+
exports.ChatProvider = ChatProvider;
|
|
3058
|
+
exports.useAllMessageEvents = useAllMessageEvents$1;
|
|
3059
|
+
exports.useBans = useBans;
|
|
3060
|
+
exports.useChatContext = useChatContext;
|
|
3061
|
+
exports.useClientProfile = useClientProfile;
|
|
3062
|
+
exports.useConnection = useConnection;
|
|
3063
|
+
exports.useConversationDetails = useConversationDetails;
|
|
3064
|
+
exports.useConversationManagement = useConversationManagement;
|
|
3065
|
+
exports.useConversations = useConversations;
|
|
3066
|
+
exports.useCustomEvents = useCustomEvents;
|
|
3067
|
+
exports.useFiles = useFiles;
|
|
3068
|
+
exports.useLogging = useLogging;
|
|
3069
|
+
exports.useMessageDeletedEvents = useMessageDeletedEvents;
|
|
3070
|
+
exports.useMessageEditedEvents = useMessageEditedEvents;
|
|
3071
|
+
exports.useMessageManagement = useMessageManagement;
|
|
3072
|
+
exports.useMessageSentEvents = useMessageSentEvents;
|
|
3073
|
+
exports.useMessages = useMessages;
|
|
3074
|
+
exports.useRealtime = useRealtime;
|
|
3075
|
+
//# sourceMappingURL=index.js.map
|