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