@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/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