@arthakosh/chat-widget 0.2.59 → 0.3.0

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.
@@ -6,41 +6,30 @@ export class SocketService {
6
6
  constructor(config) {
7
7
  this.config = config;
8
8
  this.listeners = new Map();
9
- this.isConnected = false;
10
9
  this.connect();
11
10
  }
12
11
  connect() {
13
- if (this.isConnected)
14
- return;
12
+ // this.socket = new WebSocket('wss://coreuatarthkosh.sarjak.com/ws/');
15
13
  this.socket = new WebSocket(`${this.config.wsBaseUrl}/ws/`);
16
14
  this.socket.onopen = () => {
17
- this.isConnected = true;
18
15
  console.log('[WS] Connected');
19
16
  };
20
17
  this.socket.onmessage = (event) => {
21
- const message = JSON.parse(event.data);
22
- const eventType = message.type || message.event;
23
- const payload = message.payload ?? message.data;
24
- const handlers = this.listeners.get(eventType);
25
- if (handlers && handlers.length) {
26
- handlers.forEach(h => h(payload));
27
- }
18
+ const msg = JSON.parse(event.data);
19
+ const handlers = this.listeners.get(msg.event) || [];
20
+ handlers.forEach(h => h(msg.data));
28
21
  };
29
22
  this.socket.onerror = (err) => {
30
23
  console.error('[WS] Error', err);
31
24
  };
32
25
  this.socket.onclose = () => {
33
- this.isConnected = false;
34
26
  console.warn('[WS] Disconnected – reconnecting...');
35
27
  setTimeout(() => this.connect(), 2000);
36
28
  };
37
29
  }
38
30
  emit(event, data) {
39
- if (!this.isConnected || this.socket.readyState !== WebSocket.OPEN) {
40
- console.warn('[WS] Not connected. Dropping event:', event);
41
- return;
42
- }
43
- this.socket.send(JSON.stringify({ event, data }));
31
+ const payload = { event, data };
32
+ this.socket.send(JSON.stringify(payload));
44
33
  }
45
34
  joinRoom(roomId) {
46
35
  this.emit('joinRoom', roomId);
@@ -67,6 +56,32 @@ export class SocketService {
67
56
  };
68
57
  });
69
58
  }
59
+ onNewMessage(cb) {
60
+ this.addListener('newMessage', cb);
61
+ }
62
+ offNewMessage(cb) {
63
+ this.removeListener('newMessage', cb);
64
+ }
65
+ onMessageSeen(cb) {
66
+ this.addListener('messageSeen', cb);
67
+ }
68
+ offMessageSeen(cb) {
69
+ this.removeListener('messageSeen', cb);
70
+ }
71
+ addListener(event, cb) {
72
+ if (!this.listeners.has(event)) {
73
+ this.listeners.set(event, []);
74
+ }
75
+ this.listeners.get(event).push(cb);
76
+ }
77
+ removeListener(event, cb) {
78
+ if (!cb) {
79
+ this.listeners.delete(event);
80
+ return;
81
+ }
82
+ const arr = this.listeners.get(event) || [];
83
+ this.listeners.set(event, arr.filter(h => h !== cb));
84
+ }
70
85
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SocketService, deps: [{ token: CHAT_CONFIG }], target: i0.ɵɵFactoryTarget.Injectable }); }
71
86
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SocketService, providedIn: 'root' }); }
72
87
  }
@@ -77,4 +92,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
77
92
  type: Inject,
78
93
  args: [CHAT_CONFIG]
79
94
  }] }] });
80
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29ja2V0LnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jaGF0LXdpZGdldC9zcmMvbGliL2NvcmUvc2VydmljZXMvc29ja2V0LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLE1BQU0sRUFBRSxVQUFVLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDakQsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUNoQyxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sdUJBQXVCLENBQUM7O0FBSWxELE1BQU0sT0FBTyxhQUFhO0lBTXRCLFlBQXlDLE1BQWtCO1FBQWxCLFdBQU0sR0FBTixNQUFNLENBQVk7UUFIbkQsY0FBUyxHQUFHLElBQUksR0FBRyxFQUFtQyxDQUFDO1FBQ3ZELGdCQUFXLEdBQUcsS0FBSyxDQUFDO1FBR3hCLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUNuQixDQUFDO0lBRU8sT0FBTztRQUNYLElBQUksSUFBSSxDQUFDLFdBQVc7WUFBRSxPQUFPO1FBQzdCLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxTQUFTLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsTUFBTSxDQUFDLENBQUM7UUFFNUQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsR0FBRyxFQUFFO1lBQ3RCLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO1lBQ3hCLE9BQU8sQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUNsQyxDQUFDLENBQUM7UUFFRixJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsR0FBRyxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQzlCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBRXZDLE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FB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QyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxPQUFPLENBQUMsQ0FBQyxDQUFDO1lBQzlELENBQUMsQ0FBQztRQUNOLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQzsrR0FwRlEsYUFBYSxrQkFNRixXQUFXO21IQU50QixhQUFhLGNBREQsTUFBTTs7NEZBQ2xCLGFBQWE7a0JBRHpCLFVBQVU7bUJBQUMsRUFBQyxVQUFVLEVBQUUsTUFBTSxFQUFDOzswQkFPZixNQUFNOzJCQUFDLFdBQVciLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0luamVjdCwgSW5qZWN0YWJsZX0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7T2JzZXJ2YWJsZX0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7Q0hBVF9DT05GSUd9IGZyb20gXCIuLi9jb25maWcvY2hhdC50b2tlbnNcIjtcclxuaW1wb3J0IHtDaGF0Q29uZmlnfSBmcm9tIFwiLi4vY29uZmlnL2NoYXQtY29uZmlnXCI7XHJcblxyXG5ASW5qZWN0YWJsZSh7cHJvdmlkZWRJbjogJ3Jvb3QnfSlcclxuZXhwb3J0IGNsYXNzIFNvY2tldFNlcnZpY2Uge1xyXG5cclxuICAgIHByaXZhdGUgc29ja2V0ITogV2ViU29ja2V0O1xyXG4gICAgcHJpdmF0ZSBsaXN0ZW5lcnMgPSBuZXcgTWFwPHN0cmluZywgKChkYXRhOiBhbnkpID0+IHZvaWQpW10+KCk7XHJcbiAgICBwcml2YXRlIGlzQ29ubmVjdGVkID0gZmFsc2U7XHJcblxyXG4gICAgY29uc3RydWN0b3IoQEluamVjdChDSEFUX0NPTkZJRykgcHJpdmF0ZSBjb25maWc6IENoYXRDb25maWcpIHtcclxuICAgICAgICB0aGlzLmNvbm5lY3QoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGNvbm5lY3QoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuaXNDb25uZWN0ZWQpIHJldHVybjtcclxuICAgICAgICB0aGlzLnNvY2tldCA9IG5ldyBXZWJTb2NrZXQoYCR7dGhpcy5jb25maWcud3NCYXNlVXJsfS93cy9gKTtcclxuXHJcbiAgICAgICAgdGhpcy5zb2NrZXQub25vcGVuID0gKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmlzQ29ubmVjdGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coJ1tXU10gQ29ubmVjdGVkJyk7XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgdGhpcy5zb2NrZXQub25tZXNzYWdlID0gKGV2ZW50KSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBKU09OLnBhcnNlKGV2ZW50LmRhdGEpO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgZXZlbnRUeXBlID0gbWVzc2FnZS50eXBlIHx8IG1lc3NhZ2UuZXZlbnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IHBheWxvYWQgICA9IG1lc3NhZ2UucGF5bG9hZCA/PyBtZXNzYWdlLmRhdGE7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBoYW5kbGVycyA9IHRoaXMubGlzdGVuZXJzLmdldChldmVudFR5cGUpO1xyXG5cclxuICAgICAgICAgICAgaWYgKGhhbmRsZXJzICYmIGhhbmRsZXJzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgaGFuZGxlcnMuZm9yRWFjaChoID0+IGgocGF5bG9hZCkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuXHJcblxyXG4gICAgICAgIHRoaXMuc29ja2V0Lm9uZXJyb3IgPSAoZXJyKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1tXU10gRXJyb3InLCBlcnIpO1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHRoaXMuc29ja2V0Lm9uY2xvc2UgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuaXNDb25uZWN0ZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgY29uc29sZS53YXJuKCdbV1NdIERpc2Nvbm5lY3RlZCDigJMgcmVjb25uZWN0aW5nLi4uJyk7XHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5jb25uZWN0KCksIDIwMDApO1xyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgZW1pdChldmVudDogc3RyaW5nLCBkYXRhPzogYW55KSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmlzQ29ubmVjdGVkIHx8IHRoaXMuc29ja2V0LnJlYWR5U3RhdGUgIT09IFdlYlNvY2tldC5PUEVOKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignW1dTXSBOb3QgY29ubmVjdGVkLiBEcm9wcGluZyBldmVudDonLCBldmVudCk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuc29ja2V0LnNlbmQoSlNPTi5zdHJpbmdpZnkoeyBldmVudCwgZGF0YSB9KSk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIGpvaW5Sb29tKHJvb21JZDogc3RyaW5nKSB7XHJcbiAgICAgICAgdGhpcy5lbWl0KCdqb2luUm9vbScsIHJvb21JZCk7XHJcbiAgICB9XHJcblxyXG4gICAgam9pblVzZXJDaGFubmVsKHVzZXJJZDogc3RyaW5nKSB7XHJcbiAgICAgICAgdGhpcy5lbWl0KCdqb2luVXNlckNoYW5uZWwnLCB1c2VySWQpO1xyXG4gICAgfVxyXG5cclxuICAgIHNlbmRNZXNzYWdlKGRhdGE6IGFueSkge1xyXG4gICAgICAgIHRoaXMuZW1pdCgnc2VuZE1lc3NhZ2UnLCBkYXRhKTtcclxuICAgIH1cclxuXHJcbiAgICBtZXNzYWdlU2VlbihkYXRhOiB7IGNoYXRSb29tSWQ6IHN0cmluZzsgdXNlcklkOiBzdHJpbmcgfSkge1xyXG4gICAgICAgIHRoaXMuZW1pdCgnbWVzc2FnZVNlZW4nLCBkYXRhKTtcclxuICAgIH1cclxuXHJcbiAgICBvbjxUPihldmVudDogc3RyaW5nKTogT2JzZXJ2YWJsZTxUPiB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlKHN1YiA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZXIgPSAoZGF0YTogVCkgPT4gc3ViLm5leHQoZGF0YSk7XHJcblxyXG4gICAgICAgICAgICBpZiAoIXRoaXMubGlzdGVuZXJzLmhhcyhldmVudCkpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubGlzdGVuZXJzLnNldChldmVudCwgW10pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMubGlzdGVuZXJzLmdldChldmVudCkhLnB1c2goaGFuZGxlcik7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgYXJyID0gdGhpcy5saXN0ZW5lcnMuZ2V0KGV2ZW50KSB8fCBbXTtcclxuICAgICAgICAgICAgICAgIHRoaXMubGlzdGVuZXJzLnNldChldmVudCwgYXJyLmZpbHRlcihoID0+IGggIT09IGhhbmRsZXIpKTtcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBvbk5ld01lc3NhZ2UoY2I6IChtc2c6IGFueSkgPT4gdm9pZCkge1xyXG4gICAgLy8gICAgIHRoaXMuYWRkTGlzdGVuZXIoJ25ld01lc3NhZ2UnLCBjYik7XHJcbiAgICAvLyB9XHJcbiAgICAvL1xyXG4gICAgLy8gb2ZmTmV3TWVzc2FnZShjYj86IChtc2c6IGFueSkgPT4gdm9pZCkge1xyXG4gICAgLy8gICAgIHRoaXMucmVtb3ZlTGlzdGVuZXIoJ25ld01lc3NhZ2UnLCBjYik7XHJcbiAgICAvLyB9XHJcbiAgICAvL1xyXG4gICAgLy8gb25NZXNzYWdlU2VlbihjYjogKGRhdGE6IHsgY2hhdFJvb21JZDogc3RyaW5nOyB1c2VySWQ6IHN0cmluZyB9KSA9PiB2b2lkKSB7XHJcbiAgICAvLyAgICAgdGhpcy5hZGRMaXN0ZW5lcignbWVzc2FnZVNlZW4nLCBjYik7XHJcbiAgICAvLyB9XHJcbiAgICAvL1xyXG4gICAgLy8gb2ZmTWVzc2FnZVNlZW4oY2I/OiAoZGF0YTogYW55KSA9PiB2b2lkKSB7XHJcbiAgICAvLyAgICAgdGhpcy5yZW1vdmVMaXN0ZW5lcignbWVzc2FnZVNlZW4nLCBjYik7XHJcbiAgICAvLyB9XHJcbiAgICAvL1xyXG4gICAgLy8gcHJpdmF0ZSBhZGRMaXN0ZW5lcihldmVudDogc3RyaW5nLCBjYjogKGRhdGE6IGFueSkgPT4gdm9pZCkge1xyXG4gICAgLy8gICAgIGlmICghdGhpcy5saXN0ZW5lcnMuaGFzKGV2ZW50KSkge1xyXG4gICAgLy8gICAgICAgICB0aGlzLmxpc3RlbmVycy5zZXQoZXZlbnQsIFtdKTtcclxuICAgIC8vICAgICB9XHJcbiAgICAvLyAgICAgdGhpcy5saXN0ZW5lcnMuZ2V0KGV2ZW50KSEucHVzaChjYik7XHJcbiAgICAvLyB9XHJcbiAgICAvL1xyXG4gICAgLy8gcHJpdmF0ZSByZW1vdmVMaXN0ZW5lcihldmVudDogc3RyaW5nLCBjYj86IChkYXRhOiBhbnkpID0+IHZvaWQpIHtcclxuICAgIC8vICAgICBpZiAoIWNiKSB7XHJcbiAgICAvLyAgICAgICAgIHRoaXMubGlzdGVuZXJzLmRlbGV0ZShldmVudCk7XHJcbiAgICAvLyAgICAgICAgIHJldHVybjtcclxuICAgIC8vICAgICB9XHJcbiAgICAvLyAgICAgY29uc3QgYXJyID0gdGhpcy5saXN0ZW5lcnMuZ2V0KGV2ZW50KSB8fCBbXTtcclxuICAgIC8vICAgICB0aGlzLmxpc3RlbmVycy5zZXQoZXZlbnQsIGFyci5maWx0ZXIoaCA9PiBoICE9PSBjYikpO1xyXG4gICAgLy8gfVxyXG59XHJcbiJdfQ==
95
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29ja2V0LnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jaGF0LXdpZGdldC9zcmMvbGliL2NvcmUvc2VydmljZXMvc29ja2V0LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLE1BQU0sRUFBRSxVQUFVLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDakQsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUNoQyxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sdUJBQXVCLENBQUM7O0FBSWxELE1BQU0sT0FBTyxhQUFhO0lBS3RCLFlBQXlDLE1BQWtCO1FBQWxCLFdBQU0sR0FBTixNQUFNLENBQVk7UUFGbkQsY0FBUyxHQUFHLElBQUksR0FBRyxFQUFtQyxDQUFDO1FBRzNELElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUNuQixDQUFDO0lBRU8sT0FBTztRQUNYLHVFQUF1RTtRQUV2RSxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksU0FBUyxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLE1BQU0sQ0FBQyxDQUFDO1FBRTVELElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLEdBQUcsRUFBRTtZQUN0QixPQUFPLENBQUMsR0FBRyxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDbEMsQ0FBQyxDQUFDO1FBRUYsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEdBQUcsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUM5QixNQUFNLEdBQUcsR0FBUSxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN4QyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ3JELFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FB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RUFBRSxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUVPLFdBQVcsQ0FBQyxLQUFhLEVBQUUsRUFBdUI7UUFDdEQsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDN0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ2xDLENBQUM7UUFDRCxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUVPLGNBQWMsQ0FBQyxLQUFhLEVBQUUsRUFBd0I7UUFDMUQsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ04sSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDN0IsT0FBTztRQUNYLENBQUM7UUFDRCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDNUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN6RCxDQUFDOytHQXJHUSxhQUFhLGtCQUtGLFdBQVc7bUhBTHRCLGFBQWEsY0FERCxNQUFNOzs0RkFDbEIsYUFBYTtrQkFEekIsVUFBVTttQkFBQyxFQUFDLFVBQVUsRUFBRSxNQUFNLEVBQUM7OzBCQU1mLE1BQU07MkJBQUMsV0FBVyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7SW5qZWN0LCBJbmplY3RhYmxlfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHtPYnNlcnZhYmxlfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHtDSEFUX0NPTkZJR30gZnJvbSBcIi4uL2NvbmZpZy9jaGF0LnRva2Vuc1wiO1xyXG5pbXBvcnQge0NoYXRDb25maWd9IGZyb20gXCIuLi9jb25maWcvY2hhdC1jb25maWdcIjtcclxuXHJcbkBJbmplY3RhYmxlKHtwcm92aWRlZEluOiAncm9vdCd9KVxyXG5leHBvcnQgY2xhc3MgU29ja2V0U2VydmljZSB7XHJcblxyXG4gICAgcHJpdmF0ZSBzb2NrZXQhOiBXZWJTb2NrZXQ7XHJcbiAgICBwcml2YXRlIGxpc3RlbmVycyA9IG5ldyBNYXA8c3RyaW5nLCAoKGRhdGE6IGFueSkgPT4gdm9pZClbXT4oKTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihASW5qZWN0KENIQVRfQ09ORklHKSBwcml2YXRlIGNvbmZpZzogQ2hhdENvbmZpZykge1xyXG4gICAgICAgIHRoaXMuY29ubmVjdCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgY29ubmVjdCgpIHtcclxuICAgICAgICAvLyB0aGlzLnNvY2tldCA9IG5ldyBXZWJTb2NrZXQoJ3dzczovL2NvcmV1YXRhcnRoa29zaC5zYXJqYWsuY29tL3dzLycpO1xyXG5cclxuICAgICAgICB0aGlzLnNvY2tldCA9IG5ldyBXZWJTb2NrZXQoYCR7dGhpcy5jb25maWcud3NCYXNlVXJsfS93cy9gKTtcclxuXHJcbiAgICAgICAgdGhpcy5zb2NrZXQub25vcGVuID0gKCkgPT4ge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZygnW1dTXSBDb25uZWN0ZWQnKTtcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICB0aGlzLnNvY2tldC5vbm1lc3NhZ2UgPSAoZXZlbnQpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgbXNnOiBhbnkgPSBKU09OLnBhcnNlKGV2ZW50LmRhdGEpO1xyXG4gICAgICAgICAgICBjb25zdCBoYW5kbGVycyA9IHRoaXMubGlzdGVuZXJzLmdldChtc2cuZXZlbnQpIHx8IFtdO1xyXG4gICAgICAgICAgICBoYW5kbGVycy5mb3JFYWNoKGggPT4gaChtc2cuZGF0YSkpO1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHRoaXMuc29ja2V0Lm9uZXJyb3IgPSAoZXJyKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1tXU10gRXJyb3InLCBlcnIpO1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHRoaXMuc29ja2V0Lm9uY2xvc2UgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignW1dTXSBEaXNjb25uZWN0ZWQg4oCTIHJlY29ubmVjdGluZy4uLicpO1xyXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuY29ubmVjdCgpLCAyMDAwKTtcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIGVtaXQoZXZlbnQ6IHN0cmluZywgZGF0YT86IGFueSkge1xyXG4gICAgICAgIGNvbnN0IHBheWxvYWQ6IGFueSA9IHtldmVudCwgZGF0YX07XHJcbiAgICAgICAgdGhpcy5zb2NrZXQuc2VuZChKU09OLnN0cmluZ2lmeShwYXlsb2FkKSk7XHJcbiAgICB9XHJcblxyXG4gICAgam9pblJvb20ocm9vbUlkOiBzdHJpbmcpIHtcclxuICAgICAgICB0aGlzLmVtaXQoJ2pvaW5Sb29tJywgcm9vbUlkKTtcclxuICAgIH1cclxuXHJcbiAgICBqb2luVXNlckNoYW5uZWwodXNlcklkOiBzdHJpbmcpIHtcclxuICAgICAgICB0aGlzLmVtaXQoJ2pvaW5Vc2VyQ2hhbm5lbCcsIHVzZXJJZCk7XHJcbiAgICB9XHJcblxyXG4gICAgc2VuZE1lc3NhZ2UoZGF0YTogYW55KSB7XHJcbiAgICAgICAgdGhpcy5lbWl0KCdzZW5kTWVzc2FnZScsIGRhdGEpO1xyXG4gICAgfVxyXG5cclxuICAgIG1lc3NhZ2VTZWVuKGRhdGE6IHsgY2hhdFJvb21JZDogc3RyaW5nOyB1c2VySWQ6IHN0cmluZyB9KSB7XHJcbiAgICAgICAgdGhpcy5lbWl0KCdtZXNzYWdlU2VlbicsIGRhdGEpO1xyXG4gICAgfVxyXG5cclxuICAgIG9uPFQ+KGV2ZW50OiBzdHJpbmcpOiBPYnNlcnZhYmxlPFQ+IHtcclxuICAgICAgICByZXR1cm4gbmV3IE9ic2VydmFibGUoc3ViID0+IHtcclxuICAgICAgICAgICAgY29uc3QgaGFuZGxlciA9IChkYXRhOiBUKSA9PiBzdWIubmV4dChkYXRhKTtcclxuXHJcbiAgICAgICAgICAgIGlmICghdGhpcy5saXN0ZW5lcnMuaGFzKGV2ZW50KSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5saXN0ZW5lcnMuc2V0KGV2ZW50LCBbXSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5saXN0ZW5lcnMuZ2V0KGV2ZW50KSEucHVzaChoYW5kbGVyKTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBhcnIgPSB0aGlzLmxpc3RlbmVycy5nZXQoZXZlbnQpIHx8IFtdO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5saXN0ZW5lcnMuc2V0KGV2ZW50LCBhcnIuZmlsdGVyKGggPT4gaCAhPT0gaGFuZGxlcikpO1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIG9uTmV3TWVzc2FnZShjYjogKG1zZzogYW55KSA9PiB2b2lkKSB7XHJcbiAgICAgICAgdGhpcy5hZGRMaXN0ZW5lcignbmV3TWVzc2FnZScsIGNiKTtcclxuICAgIH1cclxuXHJcbiAgICBvZmZOZXdNZXNzYWdlKGNiPzogKG1zZzogYW55KSA9PiB2b2lkKSB7XHJcbiAgICAgICAgdGhpcy5yZW1vdmVMaXN0ZW5lcignbmV3TWVzc2FnZScsIGNiKTtcclxuICAgIH1cclxuXHJcbiAgICBvbk1lc3NhZ2VTZWVuKGNiOiAoZGF0YTogeyBjaGF0Um9vbUlkOiBzdHJpbmc7IHVzZXJJZDogc3RyaW5nIH0pID0+IHZvaWQpIHtcclxuICAgICAgICB0aGlzLmFkZExpc3RlbmVyKCdtZXNzYWdlU2VlbicsIGNiKTtcclxuICAgIH1cclxuXHJcbiAgICBvZmZNZXNzYWdlU2VlbihjYj86IChkYXRhOiBhbnkpID0+IHZvaWQpIHtcclxuICAgICAgICB0aGlzLnJlbW92ZUxpc3RlbmVyKCdtZXNzYWdlU2VlbicsIGNiKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGFkZExpc3RlbmVyKGV2ZW50OiBzdHJpbmcsIGNiOiAoZGF0YTogYW55KSA9PiB2b2lkKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmxpc3RlbmVycy5oYXMoZXZlbnQpKSB7XHJcbiAgICAgICAgICAgIHRoaXMubGlzdGVuZXJzLnNldChldmVudCwgW10pO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmxpc3RlbmVycy5nZXQoZXZlbnQpIS5wdXNoKGNiKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHJlbW92ZUxpc3RlbmVyKGV2ZW50OiBzdHJpbmcsIGNiPzogKGRhdGE6IGFueSkgPT4gdm9pZCkge1xyXG4gICAgICAgIGlmICghY2IpIHtcclxuICAgICAgICAgICAgdGhpcy5saXN0ZW5lcnMuZGVsZXRlKGV2ZW50KTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBhcnIgPSB0aGlzLmxpc3RlbmVycy5nZXQoZXZlbnQpIHx8IFtdO1xyXG4gICAgICAgIHRoaXMubGlzdGVuZXJzLnNldChldmVudCwgYXJyLmZpbHRlcihoID0+IGggIT09IGNiKSk7XHJcbiAgICB9XHJcbn1cclxuIl19
@@ -1,5 +1,5 @@
1
1
  import * as i0 from '@angular/core';
2
- import { InjectionToken, Inject, Injectable, signal, EventEmitter, input, inject, ViewChild, Output, Input, Component, effect, ViewEncapsulation, APP_INITIALIZER, NgModule } from '@angular/core';
2
+ import { InjectionToken, Inject, Injectable, signal, EventEmitter, input, inject, ViewChild, Output, Input, Component, effect, ViewEncapsulation, computed, NgModule } from '@angular/core';
3
3
  import * as i1$1 from '@angular/common';
4
4
  import { CommonModule } from '@angular/common';
5
5
  import * as i2 from '@angular/forms';
@@ -34,41 +34,30 @@ class SocketService {
34
34
  constructor(config) {
35
35
  this.config = config;
36
36
  this.listeners = new Map();
37
- this.isConnected = false;
38
37
  this.connect();
39
38
  }
40
39
  connect() {
41
- if (this.isConnected)
42
- return;
40
+ // this.socket = new WebSocket('wss://coreuatarthkosh.sarjak.com/ws/');
43
41
  this.socket = new WebSocket(`${this.config.wsBaseUrl}/ws/`);
44
42
  this.socket.onopen = () => {
45
- this.isConnected = true;
46
43
  console.log('[WS] Connected');
47
44
  };
48
45
  this.socket.onmessage = (event) => {
49
- const message = JSON.parse(event.data);
50
- const eventType = message.type || message.event;
51
- const payload = message.payload ?? message.data;
52
- const handlers = this.listeners.get(eventType);
53
- if (handlers && handlers.length) {
54
- handlers.forEach(h => h(payload));
55
- }
46
+ const msg = JSON.parse(event.data);
47
+ const handlers = this.listeners.get(msg.event) || [];
48
+ handlers.forEach(h => h(msg.data));
56
49
  };
57
50
  this.socket.onerror = (err) => {
58
51
  console.error('[WS] Error', err);
59
52
  };
60
53
  this.socket.onclose = () => {
61
- this.isConnected = false;
62
54
  console.warn('[WS] Disconnected – reconnecting...');
63
55
  setTimeout(() => this.connect(), 2000);
64
56
  };
65
57
  }
66
58
  emit(event, data) {
67
- if (!this.isConnected || this.socket.readyState !== WebSocket.OPEN) {
68
- console.warn('[WS] Not connected. Dropping event:', event);
69
- return;
70
- }
71
- this.socket.send(JSON.stringify({ event, data }));
59
+ const payload = { event, data };
60
+ this.socket.send(JSON.stringify(payload));
72
61
  }
73
62
  joinRoom(roomId) {
74
63
  this.emit('joinRoom', roomId);
@@ -95,6 +84,32 @@ class SocketService {
95
84
  };
96
85
  });
97
86
  }
87
+ onNewMessage(cb) {
88
+ this.addListener('newMessage', cb);
89
+ }
90
+ offNewMessage(cb) {
91
+ this.removeListener('newMessage', cb);
92
+ }
93
+ onMessageSeen(cb) {
94
+ this.addListener('messageSeen', cb);
95
+ }
96
+ offMessageSeen(cb) {
97
+ this.removeListener('messageSeen', cb);
98
+ }
99
+ addListener(event, cb) {
100
+ if (!this.listeners.has(event)) {
101
+ this.listeners.set(event, []);
102
+ }
103
+ this.listeners.get(event).push(cb);
104
+ }
105
+ removeListener(event, cb) {
106
+ if (!cb) {
107
+ this.listeners.delete(event);
108
+ return;
109
+ }
110
+ const arr = this.listeners.get(event) || [];
111
+ this.listeners.set(event, arr.filter(h => h !== cb));
112
+ }
98
113
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SocketService, deps: [{ token: CHAT_CONFIG }], target: i0.ɵɵFactoryTarget.Injectable }); }
99
114
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SocketService, providedIn: 'root' }); }
100
115
  }
@@ -248,10 +263,6 @@ class ChatService {
248
263
  this.hasNewNotification.set(false);
249
264
  }, 1200);
250
265
  }
251
- handleIncomingMessage(msg) {
252
- this.notifications.update(n => [...n, msg]);
253
- this.hasNewNotification.set(true);
254
- }
255
266
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ChatService, deps: [{ token: i1.HttpClient }, { token: CHAT_CONFIG }, { token: SocketService }], target: i0.ɵɵFactoryTarget.Injectable }); }
256
267
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ChatService, providedIn: 'root' }); }
257
268
  }
@@ -288,9 +299,7 @@ class ChatWindowComponent {
288
299
  this.hoveredReactionUsers = [];
289
300
  }
290
301
  ngOnInit() {
291
- if (this.chatRoomId) {
292
- this.socket.joinRoom(this.chatRoomId);
293
- }
302
+ this.socket.joinRoom(this.chatRoomId);
294
303
  this.loadUsers();
295
304
  this.loadMessages();
296
305
  this.listenSocket();
@@ -315,10 +324,24 @@ class ChatWindowComponent {
315
324
  if (msg.chatRoomId === this.chatRoomId) {
316
325
  this.messages.update(list => [...list, msg]);
317
326
  }
327
+ // if (msg.senderId !== this.chatService.currentUser().userId) {
328
+ // this.messageService.add({
329
+ // severity: 'info',
330
+ // summary: this.header,
331
+ // detail: msg.content ?? 'New message',
332
+ // life: 2500
333
+ // });
334
+ // }
318
335
  });
319
336
  this.socket.on('roomUserAdded').subscribe((msg) => {
320
337
  if (msg.chatRoomId === this.chatRoomId) {
321
338
  this.loadUsers();
339
+ // this.messageService.add({
340
+ // severity: 'info',
341
+ // summary: 'User Added',
342
+ // detail: msg.user?.userName,
343
+ // life: 2500
344
+ // });
322
345
  }
323
346
  });
324
347
  this.socket.on('addedToRoom').subscribe((msg) => {
@@ -328,6 +351,14 @@ class ChatWindowComponent {
328
351
  }
329
352
  });
330
353
  this.socket.on('userAlreadyInRoom').subscribe((msg) => {
354
+ // if (msg.chatRoomId === this.chatRoomId) {
355
+ // this.messageService.add({
356
+ // severity: 'info',
357
+ // summary: 'User Already Added',
358
+ // detail: msg.user?.userName,
359
+ // life: 2500
360
+ // });
361
+ // }
331
362
  });
332
363
  }
333
364
  send() {
@@ -370,8 +401,8 @@ class ChatWindowComponent {
370
401
  return msg.id;
371
402
  }
372
403
  ngOnDestroy() {
373
- // this.socket.offNewMessage();
374
- // this.socket.offMessageSeen();
404
+ this.socket.offNewMessage();
405
+ this.socket.offMessageSeen();
375
406
  this.observer?.disconnect();
376
407
  }
377
408
  ngAfterViewInit() {
@@ -465,6 +496,7 @@ class ChatLauncherComponent {
465
496
  }, { allowSignalWrites: true });
466
497
  }
467
498
  ngOnInit() {
499
+ console.log('ChatLauncher initialized');
468
500
  }
469
501
  openNewRoom(roomId, roomHeader, metadata, userId, username, chatUsers) {
470
502
  this.isVisible.set(true);
@@ -482,21 +514,21 @@ class ChatLauncherComponent {
482
514
  }
483
515
  const newIndex = windows.length;
484
516
  this.openWindows.update(ws => [...ws, { roomId, header, metadata }]);
517
+ // ✅ force real change: -1 → 0
485
518
  setTimeout(() => {
486
519
  this.activeIndex.set(newIndex);
487
520
  }, 500);
488
521
  }
489
522
  closeWindow(roomId) {
490
523
  this.openWindows.update(ws => ws.filter(w => w.roomId !== roomId));
491
- const windows = this.openWindows();
492
- const newIndex = windows.length;
493
- this.activeIndex.set(newIndex);
494
524
  }
495
525
  setActive(i) {
496
526
  this.activeIndex.set(i);
497
527
  }
498
528
  closeAll() {
499
529
  this.openWindows.set([]);
530
+ // this.lastOpenedRoom.set(null);
531
+ // this.activeIndex.set(0);
500
532
  this.isVisible.set(false);
501
533
  }
502
534
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ChatLauncherComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
@@ -613,102 +645,33 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
613
645
  type: Output
614
646
  }] } });
615
647
 
616
- class NotificationService {
617
- constructor(socketService) {
618
- this.socketService = socketService;
619
- }
620
- notifications$() {
621
- return this.socketService.on('notifications');
622
- }
623
- getTotalCount(notifications) {
624
- return notifications.reduce((sum, n) => sum + (n.count || 0), 0);
625
- }
626
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: NotificationService, deps: [{ token: SocketService }], target: i0.ɵɵFactoryTarget.Injectable }); }
627
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: NotificationService, providedIn: 'root' }); }
628
- }
629
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: NotificationService, decorators: [{
630
- type: Injectable,
631
- args: [{ providedIn: 'root' }]
632
- }], ctorParameters: () => [{ type: SocketService }] });
633
-
634
648
  class ChatWidgetNotificationComponent {
635
649
  constructor() {
636
650
  this.open = false;
637
651
  this.chatService = inject(ChatService);
638
- this.socketService = inject(SocketService);
639
- this.notificationService = inject(NotificationService);
640
- this.notifications = [];
641
- this.totalCount = 0;
642
- this.user = input(null);
643
- }
644
- ngOnInit() {
645
- if (!this.user) {
646
- console.error('user is required');
647
- return;
648
- }
649
- this.notificationService.notifications$()
650
- .subscribe((notifications) => {
651
- this.notifications = notifications;
652
- this.totalCount =
653
- this.notificationService.getTotalCount(notifications);
654
- });
652
+ this.notifications = this.chatService.notifications;
653
+ this.hasNew = this.chatService.hasNewNotification;
654
+ this.totalCount = computed(() => this.notifications().reduce((a, b) => a + b.unreadCount, 0));
655
655
  }
656
656
  toggle() {
657
657
  this.open = !this.open;
658
658
  }
659
659
  openRoom(n) {
660
+ // this.chatLauncher.openRoom(n.roomId);
660
661
  this.chatService.clearRoom(n.roomId);
661
662
  this.open = false;
662
- // this.http.post(
663
- // `/api/chat/notifications/${notification.id}/read`,
664
- // { userId: this.currentUserId }
665
- // ).subscribe();
666
663
  }
667
664
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ChatWidgetNotificationComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
668
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: ChatWidgetNotificationComponent, isStandalone: true, selector: "chat-widget-notification", inputs: { user: { classPropertyName: "user", publicName: "user", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "<div (click)=\"toggle()\" class=\"notif-icon\">\r\n <i class=\"pi pi-bell\" [class.pulse]=\"totalCount > 0\"></i>\r\n\r\n @if (totalCount > 0) {\r\n <span class=\"dot\"></span>\r\n <span class=\"badge\">{{ totalCount }}</span>\r\n }\r\n</div>\r\n\r\n@if (open) {\r\n <div class=\"notif-panel\">\r\n <div class=\"notif-list\">\r\n @for (n of notifications; track n.id) {\r\n <div class=\"notif-item\" (click)=\"openRoom(n)\" [attr.data-type]=\"n.type\">\r\n <div class=\"notif-left\">\r\n <i class=\"pi pi-comments\"></i>\r\n </div>\r\n\r\n <div class=\"notif-body\">\r\n <div class=\"notif-title\">\r\n Room {{ n.room_id }}\r\n </div>\r\n\r\n <div class=\"notif-text\">\r\n {{ n.description }}\r\n </div>\r\n </div>\r\n\r\n <span class=\"count\">{{ n.count }}</span>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n}\r\n", styles: [".notif-icon{position:relative;cursor:pointer;display:flex;align-items:center;justify-content:center}.notif-icon i{font-size:1.4rem;color:#444}.pulse{animation:pulse 1.2s ease-out}@keyframes pulse{0%{transform:scale(1)}40%{transform:scale(1.2)}to{transform:scale(1)}}.dot{position:absolute;top:2px;right:4px;width:8px;height:8px;background:#e53935;border-radius:50%}.badge{position:absolute;top:-6px;right:-10px;background:#e53935;color:#fff;font-size:.65rem;min-width:18px;height:18px;padding:0 5px;border-radius:10px;display:flex;align-items:center;justify-content:center;font-weight:600}.notif-panel{position:absolute;top:42px;right:0;width:320px;background:#fff;border-radius:8px;box-shadow:0 12px 28px #00000026;z-index:9999;overflow:hidden;animation:fadeIn .15s ease-out}@keyframes fadeIn{0%{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:translateY(0)}}.notif-list{max-height:360px;overflow-y:auto}.notif-item{display:flex;align-items:center;padding:12px 14px;cursor:pointer;transition:background .15s ease;border-bottom:1px solid #eee}.notif-item:last-child{border-bottom:none}.notif-item:hover{background:#f5f7fa}.notif-left{width:36px;height:36px;border-radius:50%;background:#e3f2fd;color:#1976d2;display:flex;align-items:center;justify-content:center;margin-right:12px;flex-shrink:0}.notif-body{flex:1;min-width:0}.notif-title{font-size:.85rem;font-weight:600;color:#222;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.notif-text{font-size:.75rem;color:#666;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.count{margin-left:10px;background:#1976d2;color:#fff;font-size:.65rem;min-width:20px;height:20px;border-radius:10px;display:flex;align-items:center;justify-content:center;font-weight:600;flex-shrink:0}.notif-item[data-type=NEW_MESSAGE] .notif-left{background:#e3f2fd;color:#1976d2}.notif-item[data-type=USER_ADDED] .notif-left{background:#e8f5e9;color:#2e7d32}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }] }); }
665
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: ChatWidgetNotificationComponent, isStandalone: true, selector: "chat-widget-notification", ngImport: i0, template: "<div (click)=\"toggle()\" class=\"notif-icon\">\r\n <i class=\"pi pi-bell\" [class.pulse]=\"hasNew()\"></i>\r\n\r\n @if (totalCount() > 0) {\r\n <span class=\"dot\"></span>\r\n <span class=\"badge\">{{ totalCount() }}</span>\r\n }\r\n</div>\r\n\r\n@if (open) {\r\n <div class=\"notif-panel\">\r\n<!-- <div class=\"notif-header\">Notifications</div>-->\r\n\r\n <div class=\"notif-list\">\r\n @for (n of notifications(); track n.roomId) {\r\n <div class=\"notif-item\" (click)=\"openRoom(n)\">\r\n <div class=\"notif-left\">\r\n <i class=\"pi pi-comments\"></i>\r\n </div>\r\n\r\n <div class=\"notif-body\">\r\n <div class=\"notif-title\">{{ n.roomName }}</div>\r\n <div class=\"notif-text\">\r\n {{ n.lastMessage || 'You were added to this room' }}\r\n </div>\r\n </div>\r\n\r\n <span class=\"count\">{{ n.unreadCount }}</span>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n}\r\n", styles: [".notif-icon{position:relative;cursor:pointer;display:flex;align-items:center;justify-content:center}.notif-icon i{font-size:1.4rem;color:#444}.pulse{animation:pulse 1.2s ease-out}@keyframes pulse{0%{transform:scale(1)}40%{transform:scale(1.2)}to{transform:scale(1)}}.dot{position:absolute;top:2px;right:4px;width:8px;height:8px;background:#e53935;border-radius:50%}.badge{position:absolute;top:-6px;right:-10px;background:#e53935;color:#fff;font-size:.65rem;min-width:18px;height:18px;padding:0 5px;border-radius:10px;display:flex;align-items:center;justify-content:center;font-weight:600}.notif-panel{position:absolute;top:42px;right:0;width:320px;background:#fff;border-radius:8px;box-shadow:0 12px 28px #00000026;z-index:9999;overflow:hidden;animation:fadeIn .15s ease-out}@keyframes fadeIn{0%{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:translateY(0)}}.notif-header{padding:12px 16px;font-weight:600;font-size:.9rem;border-bottom:1px solid #eee}.notif-list{max-height:360px;overflow-y:auto}.notif-item{display:flex;align-items:center;padding:12px 14px;cursor:pointer;transition:background .15s ease}.notif-item:hover{background:#f5f7fa}.notif-left{width:36px;height:36px;border-radius:50%;background:#e3f2fd;color:#1976d2;display:flex;align-items:center;justify-content:center;margin-right:12px}.notif-body{flex:1;min-width:0}.notif-title{font-size:.85rem;font-weight:600;color:#222;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.notif-text{font-size:.75rem;color:#666;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.count{background:#1976d2;color:#fff;font-size:.65rem;min-width:20px;height:20px;border-radius:10px;display:flex;align-items:center;justify-content:center;font-weight:600}.notif-item{background:#f0f6ff}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }] }); }
669
666
  }
670
667
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ChatWidgetNotificationComponent, decorators: [{
671
668
  type: Component,
672
669
  args: [{ selector: 'chat-widget-notification', standalone: true, imports: [
673
670
  CommonModule,
674
671
  FormsModule
675
- ], template: "<div (click)=\"toggle()\" class=\"notif-icon\">\r\n <i class=\"pi pi-bell\" [class.pulse]=\"totalCount > 0\"></i>\r\n\r\n @if (totalCount > 0) {\r\n <span class=\"dot\"></span>\r\n <span class=\"badge\">{{ totalCount }}</span>\r\n }\r\n</div>\r\n\r\n@if (open) {\r\n <div class=\"notif-panel\">\r\n <div class=\"notif-list\">\r\n @for (n of notifications; track n.id) {\r\n <div class=\"notif-item\" (click)=\"openRoom(n)\" [attr.data-type]=\"n.type\">\r\n <div class=\"notif-left\">\r\n <i class=\"pi pi-comments\"></i>\r\n </div>\r\n\r\n <div class=\"notif-body\">\r\n <div class=\"notif-title\">\r\n Room {{ n.room_id }}\r\n </div>\r\n\r\n <div class=\"notif-text\">\r\n {{ n.description }}\r\n </div>\r\n </div>\r\n\r\n <span class=\"count\">{{ n.count }}</span>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n}\r\n", styles: [".notif-icon{position:relative;cursor:pointer;display:flex;align-items:center;justify-content:center}.notif-icon i{font-size:1.4rem;color:#444}.pulse{animation:pulse 1.2s ease-out}@keyframes pulse{0%{transform:scale(1)}40%{transform:scale(1.2)}to{transform:scale(1)}}.dot{position:absolute;top:2px;right:4px;width:8px;height:8px;background:#e53935;border-radius:50%}.badge{position:absolute;top:-6px;right:-10px;background:#e53935;color:#fff;font-size:.65rem;min-width:18px;height:18px;padding:0 5px;border-radius:10px;display:flex;align-items:center;justify-content:center;font-weight:600}.notif-panel{position:absolute;top:42px;right:0;width:320px;background:#fff;border-radius:8px;box-shadow:0 12px 28px #00000026;z-index:9999;overflow:hidden;animation:fadeIn .15s ease-out}@keyframes fadeIn{0%{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:translateY(0)}}.notif-list{max-height:360px;overflow-y:auto}.notif-item{display:flex;align-items:center;padding:12px 14px;cursor:pointer;transition:background .15s ease;border-bottom:1px solid #eee}.notif-item:last-child{border-bottom:none}.notif-item:hover{background:#f5f7fa}.notif-left{width:36px;height:36px;border-radius:50%;background:#e3f2fd;color:#1976d2;display:flex;align-items:center;justify-content:center;margin-right:12px;flex-shrink:0}.notif-body{flex:1;min-width:0}.notif-title{font-size:.85rem;font-weight:600;color:#222;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.notif-text{font-size:.75rem;color:#666;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.count{margin-left:10px;background:#1976d2;color:#fff;font-size:.65rem;min-width:20px;height:20px;border-radius:10px;display:flex;align-items:center;justify-content:center;font-weight:600;flex-shrink:0}.notif-item[data-type=NEW_MESSAGE] .notif-left{background:#e3f2fd;color:#1976d2}.notif-item[data-type=USER_ADDED] .notif-left{background:#e8f5e9;color:#2e7d32}\n"] }]
672
+ ], template: "<div (click)=\"toggle()\" class=\"notif-icon\">\r\n <i class=\"pi pi-bell\" [class.pulse]=\"hasNew()\"></i>\r\n\r\n @if (totalCount() > 0) {\r\n <span class=\"dot\"></span>\r\n <span class=\"badge\">{{ totalCount() }}</span>\r\n }\r\n</div>\r\n\r\n@if (open) {\r\n <div class=\"notif-panel\">\r\n<!-- <div class=\"notif-header\">Notifications</div>-->\r\n\r\n <div class=\"notif-list\">\r\n @for (n of notifications(); track n.roomId) {\r\n <div class=\"notif-item\" (click)=\"openRoom(n)\">\r\n <div class=\"notif-left\">\r\n <i class=\"pi pi-comments\"></i>\r\n </div>\r\n\r\n <div class=\"notif-body\">\r\n <div class=\"notif-title\">{{ n.roomName }}</div>\r\n <div class=\"notif-text\">\r\n {{ n.lastMessage || 'You were added to this room' }}\r\n </div>\r\n </div>\r\n\r\n <span class=\"count\">{{ n.unreadCount }}</span>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n}\r\n", styles: [".notif-icon{position:relative;cursor:pointer;display:flex;align-items:center;justify-content:center}.notif-icon i{font-size:1.4rem;color:#444}.pulse{animation:pulse 1.2s ease-out}@keyframes pulse{0%{transform:scale(1)}40%{transform:scale(1.2)}to{transform:scale(1)}}.dot{position:absolute;top:2px;right:4px;width:8px;height:8px;background:#e53935;border-radius:50%}.badge{position:absolute;top:-6px;right:-10px;background:#e53935;color:#fff;font-size:.65rem;min-width:18px;height:18px;padding:0 5px;border-radius:10px;display:flex;align-items:center;justify-content:center;font-weight:600}.notif-panel{position:absolute;top:42px;right:0;width:320px;background:#fff;border-radius:8px;box-shadow:0 12px 28px #00000026;z-index:9999;overflow:hidden;animation:fadeIn .15s ease-out}@keyframes fadeIn{0%{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:translateY(0)}}.notif-header{padding:12px 16px;font-weight:600;font-size:.9rem;border-bottom:1px solid #eee}.notif-list{max-height:360px;overflow-y:auto}.notif-item{display:flex;align-items:center;padding:12px 14px;cursor:pointer;transition:background .15s ease}.notif-item:hover{background:#f5f7fa}.notif-left{width:36px;height:36px;border-radius:50%;background:#e3f2fd;color:#1976d2;display:flex;align-items:center;justify-content:center;margin-right:12px}.notif-body{flex:1;min-width:0}.notif-title{font-size:.85rem;font-weight:600;color:#222;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.notif-text{font-size:.75rem;color:#666;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.count{background:#1976d2;color:#fff;font-size:.65rem;min-width:20px;height:20px;border-radius:10px;display:flex;align-items:center;justify-content:center;font-weight:600}.notif-item{background:#f0f6ff}\n"] }]
676
673
  }], ctorParameters: () => [] });
677
674
 
678
- class ChatWidgetBootstrapService {
679
- constructor(socketService, chatService, config) {
680
- this.socketService = socketService;
681
- this.chatService = chatService;
682
- this.config = config;
683
- this.initialized = false;
684
- effect(() => {
685
- const user = this.chatService.currentUser();
686
- if (!user?.userId || this.initialized)
687
- return;
688
- console.log('[ChatWidget] user available → join channel', user.userId);
689
- this.initialized = true;
690
- setTimeout(() => {
691
- this.socketService.joinUserChannel(user.userId);
692
- }, 800);
693
- this.socketService.on('newMessage').subscribe(msg => {
694
- this.chatService.handleIncomingMessage(msg);
695
- });
696
- });
697
- }
698
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ChatWidgetBootstrapService, deps: [{ token: SocketService }, { token: ChatService }, { token: CHAT_CONFIG }], target: i0.ɵɵFactoryTarget.Injectable }); }
699
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ChatWidgetBootstrapService, providedIn: 'root' }); }
700
- }
701
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ChatWidgetBootstrapService, decorators: [{
702
- type: Injectable,
703
- args: [{ providedIn: 'root' }]
704
- }], ctorParameters: () => [{ type: SocketService }, { type: ChatService }, { type: undefined, decorators: [{
705
- type: Inject,
706
- args: [CHAT_CONFIG]
707
- }] }] });
708
-
709
- function chatWidgetInitializer(bootstrap) {
710
- return () => { };
711
- }
712
675
  class ChatWidgetModule {
713
676
  static forRoot(config) {
714
677
  return {
@@ -727,14 +690,7 @@ class ChatWidgetModule {
727
690
  ChatWindowComponent,
728
691
  AllChatsComponent,
729
692
  ChatWidgetNotificationComponent], exports: [ChatLauncherComponent] }); }
730
- static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ChatWidgetModule, providers: [
731
- {
732
- provide: APP_INITIALIZER,
733
- useFactory: chatWidgetInitializer,
734
- deps: [ChatWidgetBootstrapService],
735
- multi: true
736
- }
737
- ], imports: [CommonModule,
693
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ChatWidgetModule, imports: [CommonModule,
738
694
  ChatLauncherComponent,
739
695
  ChatWindowComponent,
740
696
  AllChatsComponent,
@@ -751,21 +707,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
751
707
  AllChatsComponent,
752
708
  ChatWidgetNotificationComponent
753
709
  ],
754
- exports: [ChatLauncherComponent],
755
- providers: [
756
- {
757
- provide: APP_INITIALIZER,
758
- useFactory: chatWidgetInitializer,
759
- deps: [ChatWidgetBootstrapService],
760
- multi: true
761
- }
762
- ]
710
+ exports: [ChatLauncherComponent]
763
711
  }]
764
712
  }] });
765
713
 
766
714
  class ChatWidgetService {
767
- constructor(chatService) {
768
- this.chatService = chatService;
715
+ constructor() {
716
+ this.chatService = inject(ChatService);
717
+ this.socketService = inject(SocketService);
769
718
  }
770
719
  initUser(user) {
771
720
  this.chatService.currentUser.set({
@@ -773,14 +722,15 @@ class ChatWidgetService {
773
722
  userId: user.id,
774
723
  name: user.name
775
724
  });
725
+ this.socketService.joinUserChannel(this.chatService.currentUser().userId);
776
726
  }
777
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ChatWidgetService, deps: [{ token: ChatService }], target: i0.ɵɵFactoryTarget.Injectable }); }
727
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ChatWidgetService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
778
728
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ChatWidgetService, providedIn: 'root' }); }
779
729
  }
780
730
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ChatWidgetService, decorators: [{
781
731
  type: Injectable,
782
732
  args: [{ providedIn: 'root' }]
783
- }], ctorParameters: () => [{ type: ChatService }] });
733
+ }], ctorParameters: () => [] });
784
734
 
785
735
  /*
786
736
  * Public API Surface of chat-widget
@@ -790,5 +740,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
790
740
  * Generated bundle index. Do not edit.
791
741
  */
792
742
 
793
- export { AllChatsComponent, ChatLauncherComponent, ChatWidgetModule, ChatWidgetNotificationComponent, ChatWidgetService, chatWidgetInitializer };
743
+ export { AllChatsComponent, ChatLauncherComponent, ChatWidgetModule, ChatWidgetNotificationComponent, ChatWidgetService };
794
744
  //# sourceMappingURL=arthakosh-chat-widget.mjs.map