@arthakosh/chat-widget 0.2.60 → 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,103 +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('notifications').subscribe(msg => {
694
- console.log('[ChatWidget] new notification', msg);
695
- this.chatService.handleIncomingMessage(msg);
696
- });
697
- });
698
- }
699
- 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 }); }
700
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ChatWidgetBootstrapService, providedIn: 'root' }); }
701
- }
702
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ChatWidgetBootstrapService, decorators: [{
703
- type: Injectable,
704
- args: [{ providedIn: 'root' }]
705
- }], ctorParameters: () => [{ type: SocketService }, { type: ChatService }, { type: undefined, decorators: [{
706
- type: Inject,
707
- args: [CHAT_CONFIG]
708
- }] }] });
709
-
710
- function chatWidgetInitializer(bootstrap) {
711
- return () => { };
712
- }
713
675
  class ChatWidgetModule {
714
676
  static forRoot(config) {
715
677
  return {
@@ -728,14 +690,7 @@ class ChatWidgetModule {
728
690
  ChatWindowComponent,
729
691
  AllChatsComponent,
730
692
  ChatWidgetNotificationComponent], exports: [ChatLauncherComponent] }); }
731
- static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ChatWidgetModule, providers: [
732
- {
733
- provide: APP_INITIALIZER,
734
- useFactory: chatWidgetInitializer,
735
- deps: [ChatWidgetBootstrapService],
736
- multi: true
737
- }
738
- ], imports: [CommonModule,
693
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ChatWidgetModule, imports: [CommonModule,
739
694
  ChatLauncherComponent,
740
695
  ChatWindowComponent,
741
696
  AllChatsComponent,
@@ -752,21 +707,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
752
707
  AllChatsComponent,
753
708
  ChatWidgetNotificationComponent
754
709
  ],
755
- exports: [ChatLauncherComponent],
756
- providers: [
757
- {
758
- provide: APP_INITIALIZER,
759
- useFactory: chatWidgetInitializer,
760
- deps: [ChatWidgetBootstrapService],
761
- multi: true
762
- }
763
- ]
710
+ exports: [ChatLauncherComponent]
764
711
  }]
765
712
  }] });
766
713
 
767
714
  class ChatWidgetService {
768
- constructor(chatService) {
769
- this.chatService = chatService;
715
+ constructor() {
716
+ this.chatService = inject(ChatService);
717
+ this.socketService = inject(SocketService);
770
718
  }
771
719
  initUser(user) {
772
720
  this.chatService.currentUser.set({
@@ -774,14 +722,15 @@ class ChatWidgetService {
774
722
  userId: user.id,
775
723
  name: user.name
776
724
  });
725
+ this.socketService.joinUserChannel(this.chatService.currentUser().userId);
777
726
  }
778
- 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 }); }
779
728
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ChatWidgetService, providedIn: 'root' }); }
780
729
  }
781
730
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ChatWidgetService, decorators: [{
782
731
  type: Injectable,
783
732
  args: [{ providedIn: 'root' }]
784
- }], ctorParameters: () => [{ type: ChatService }] });
733
+ }], ctorParameters: () => [] });
785
734
 
786
735
  /*
787
736
  * Public API Surface of chat-widget
@@ -791,5 +740,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
791
740
  * Generated bundle index. Do not edit.
792
741
  */
793
742
 
794
- export { AllChatsComponent, ChatLauncherComponent, ChatWidgetModule, ChatWidgetNotificationComponent, ChatWidgetService, chatWidgetInitializer };
743
+ export { AllChatsComponent, ChatLauncherComponent, ChatWidgetModule, ChatWidgetNotificationComponent, ChatWidgetService };
795
744
  //# sourceMappingURL=arthakosh-chat-widget.mjs.map