@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.
- package/esm2022/lib/chat-launcher/chat-launcher.component.mjs +5 -4
- package/esm2022/lib/chat-widget-notification/chat-widget-notification.component.mjs +8 -27
- package/esm2022/lib/chat-widget.module.mjs +4 -23
- package/esm2022/lib/chat-widget.service.mjs +10 -7
- package/esm2022/lib/chat-window/chat-window.component.mjs +26 -6
- package/esm2022/lib/core/services/chat.service.mjs +1 -5
- package/esm2022/lib/core/services/socket.service.mjs +33 -18
- package/fesm2022/arthakosh-chat-widget.mjs +77 -128
- package/fesm2022/arthakosh-chat-widget.mjs.map +1 -1
- package/lib/chat-widget-notification/chat-widget-notification.component.d.ts +4 -9
- package/lib/chat-widget.module.d.ts +0 -2
- package/lib/chat-widget.service.d.ts +4 -2
- package/lib/core/services/chat.service.d.ts +0 -1
- package/lib/core/services/socket.service.d.ts +9 -1
- package/package.json +1 -1
- package/esm2022/lib/core/services/chat_widget_bootstrap.service.mjs +0 -37
- package/esm2022/lib/core/services/notification.service.mjs +0 -21
- package/lib/core/services/chat_widget_bootstrap.service.d.ts +0 -13
- package/lib/core/services/notification.service.d.ts +0 -11
|
@@ -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
|
-
|
|
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
|
|
22
|
-
const
|
|
23
|
-
|
|
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
|
-
|
|
40
|
-
|
|
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,
|
|
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,
|
|
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
|
-
|
|
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
|
|
50
|
-
const
|
|
51
|
-
|
|
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
|
-
|
|
68
|
-
|
|
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
|
-
|
|
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
|
-
|
|
374
|
-
|
|
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.
|
|
639
|
-
this.
|
|
640
|
-
this.
|
|
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",
|
|
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]=\"
|
|
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,
|
|
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(
|
|
769
|
-
this.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: [
|
|
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: () => [
|
|
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
|
|
743
|
+
export { AllChatsComponent, ChatLauncherComponent, ChatWidgetModule, ChatWidgetNotificationComponent, ChatWidgetService };
|
|
795
744
|
//# sourceMappingURL=arthakosh-chat-widget.mjs.map
|