@arthakosh/chat 0.0.1

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.
Files changed (32) hide show
  1. package/README.md +24 -0
  2. package/esm2022/arthakosh-chat.mjs +5 -0
  3. package/esm2022/lib/all-chats/all-chats.component.mjs +121 -0
  4. package/esm2022/lib/chat-launcher/chat-launcher.component.mjs +96 -0
  5. package/esm2022/lib/chat-widget-notification/chat-widget-notification.component.mjs +69 -0
  6. package/esm2022/lib/chat-widget.module.mjs +47 -0
  7. package/esm2022/lib/chat-widget.service.mjs +12 -0
  8. package/esm2022/lib/chat-window/chat-window.component.mjs +210 -0
  9. package/esm2022/lib/core/config/chat-config.mjs +2 -0
  10. package/esm2022/lib/core/config/chat.tokens.mjs +4 -0
  11. package/esm2022/lib/core/models/chat.models.mjs +2 -0
  12. package/esm2022/lib/core/models/notification.model.mjs +2 -0
  13. package/esm2022/lib/core/services/chat.service.mjs +117 -0
  14. package/esm2022/lib/core/services/socket.service.mjs +148 -0
  15. package/esm2022/public-api.mjs +10 -0
  16. package/fesm2022/arthakosh-chat.mjs +776 -0
  17. package/fesm2022/arthakosh-chat.mjs.map +1 -0
  18. package/index.d.ts +5 -0
  19. package/lib/all-chats/all-chats.component.d.ts +23 -0
  20. package/lib/chat-launcher/chat-launcher.component.d.ts +34 -0
  21. package/lib/chat-widget-notification/chat-widget-notification.component.d.ts +22 -0
  22. package/lib/chat-widget.module.d.ts +14 -0
  23. package/lib/chat-widget.service.d.ts +6 -0
  24. package/lib/chat-window/chat-window.component.d.ts +49 -0
  25. package/lib/core/config/chat-config.d.ts +4 -0
  26. package/lib/core/config/chat.tokens.d.ts +3 -0
  27. package/lib/core/models/chat.models.d.ts +22 -0
  28. package/lib/core/models/notification.model.d.ts +6 -0
  29. package/lib/core/services/chat.service.d.ts +34 -0
  30. package/lib/core/services/socket.service.d.ts +38 -0
  31. package/package.json +42 -0
  32. package/public-api.d.ts +6 -0
package/README.md ADDED
@@ -0,0 +1,24 @@
1
+ # ChatWidget
2
+
3
+ This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 17.3.0.
4
+
5
+ ## Code scaffolding
6
+
7
+ Run `ng generate component component-name --project chat-widget` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module --project chat-widget`.
8
+ > Note: Don't forget to add `--project chat-widget` or else it will be added to the default project in your `angular.json` file.
9
+
10
+ ## Build
11
+
12
+ Run `ng build chat-widget` to build the project. The build artifacts will be stored in the `dist/` directory.
13
+
14
+ ## Publishing
15
+
16
+ After building your library with `ng build chat-widget`, go to the dist folder `cd dist/chat-widget` and run `npm publish`.
17
+
18
+ ## Running unit tests
19
+
20
+ Run `ng test chat-widget` to execute the unit tests via [Karma](https://karma-runner.github.io).
21
+
22
+ ## Further help
23
+
24
+ To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI Overview and Command Reference](https://angular.io/cli) page.
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ export * from './public-api';
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJ0aGFrb3NoLWNoYXQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9wcm9qZWN0cy9jaGF0LXdpZGdldC9zcmMvYXJ0aGFrb3NoLWNoYXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLGNBQWMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuZXJhdGVkIGJ1bmRsZSBpbmRleC4gRG8gbm90IGVkaXQuXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9wdWJsaWMtYXBpJztcbiJdfQ==
@@ -0,0 +1,121 @@
1
+ import { Component, EventEmitter, inject, input, Output, signal } from '@angular/core';
2
+ import { ChatService } from '../core/services/chat.service';
3
+ import { ChatWindowComponent } from "../chat-window/chat-window.component";
4
+ import { CommonModule } from '@angular/common';
5
+ import { FormsModule } from '@angular/forms';
6
+ import { AvatarModule } from 'primeng/avatar';
7
+ import { ButtonModule } from 'primeng/button';
8
+ import { ChipModule } from 'primeng/chip';
9
+ import { DropdownModule } from 'primeng/dropdown';
10
+ import { InputTextareaModule } from 'primeng/inputtextarea';
11
+ import { OverlayPanelModule } from 'primeng/overlaypanel';
12
+ import { ToastModule } from 'primeng/toast';
13
+ import { TooltipModule } from 'primeng/tooltip';
14
+ import { animate, style, transition, trigger } from '@angular/animations';
15
+ import { SocketService } from '../core/services/socket.service';
16
+ import * as i0 from "@angular/core";
17
+ import * as i1 from "@angular/common";
18
+ import * as i2 from "primeng/avatar";
19
+ export class AllChatsComponent {
20
+ constructor() {
21
+ this.user = input(null);
22
+ this.roomId = input(null);
23
+ this.chatUsers = signal([]);
24
+ this.newRoomLoaded = new EventEmitter();
25
+ this.rooms = [];
26
+ this.activeRoomId = signal('');
27
+ this.activeRoomHeader = signal('');
28
+ this.activeRoomMetadata = signal('');
29
+ this.chatService = inject(ChatService);
30
+ this.socketService = inject(SocketService);
31
+ this.showMessages = false;
32
+ }
33
+ ngOnInit() {
34
+ if (!this.user) {
35
+ console.error('user is required');
36
+ return;
37
+ }
38
+ this.chatService.currentUser.set({
39
+ roomId: this.activeRoomId,
40
+ userId: this.user()?.id,
41
+ name: this.user()?.name
42
+ });
43
+ this.socketService.connect(this.user().id);
44
+ this.chatService.getRooms(this.user()?.id, this.roomId()).subscribe(res => {
45
+ this.rooms = res;
46
+ if (this.rooms.length != 0) {
47
+ this.selectRoom(this.rooms[0]);
48
+ this.activeRoomId.set(this.rooms[0].ChatRoomId);
49
+ this.activeRoomHeader.set(this.rooms[0].ChatRoomName);
50
+ this.activeRoomMetadata.set(this.rooms[0].Metadata);
51
+ }
52
+ else {
53
+ this.chatService.addUserToRoom(this.roomId(), this.user()?.id, this.user()?.name, this.chatService.currentUser().userId).subscribe((res) => {
54
+ this.rooms = [];
55
+ this.getRooms();
56
+ });
57
+ }
58
+ });
59
+ }
60
+ getRooms() {
61
+ this.chatService.getRooms(this.user()?.id, this.roomId()).subscribe(res => {
62
+ this.rooms = res;
63
+ if (this.rooms.length != 0) {
64
+ this.selectRoom(this.rooms[0]);
65
+ this.activeRoomId.set(this.rooms[0].ChatRoomId);
66
+ this.activeRoomHeader.set(this.rooms[0].ChatRoomName);
67
+ this.activeRoomMetadata.set(this.rooms[0].Metadata);
68
+ }
69
+ });
70
+ }
71
+ selectRoom(room) {
72
+ this.showMessages = false;
73
+ this.activeRoomId.set(room.ChatRoomId);
74
+ this.activeRoomHeader.set(room.ChatRoomName);
75
+ this.activeRoomMetadata.set(room.Metadata);
76
+ setTimeout(() => {
77
+ this.showMessages = true;
78
+ }, 800);
79
+ }
80
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AllChatsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
81
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: AllChatsComponent, isStandalone: true, selector: "app-all-chats", inputs: { user: { classPropertyName: "user", publicName: "user", isSignal: true, isRequired: false, transformFunction: null }, roomId: { classPropertyName: "roomId", publicName: "roomId", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { newRoomLoaded: "newRoomLoaded" }, ngImport: i0, template: "<div class=\"chat-page\">\r\n <!-- LEFT SIDEBAR : CHAT ROOMS -->\r\n <aside class=\"chat-sidebar glass\">\r\n <div class=\"sidebar-header\">\r\n <h3>Chat Rooms</h3>\r\n </div>\r\n <ul class=\"room-list\">\r\n <li (click)=\"selectRoom(room)\" *ngFor=\"let room of rooms;\" [class.active]=\"activeRoomId() === room.ChatRoomId\"\r\n class=\"room-item\">\r\n <div class=\"room-avatar\">\r\n <p-avatar [label]=\"room.ChatRoomName[0]\"></p-avatar>\r\n </div>\r\n <div class=\"room-info\">\r\n <span class=\"room-name\">{{ room.ChatRoomName }}</span>\r\n <span class=\"room-name\">{{ room.Metadata }}</span>\r\n </div>\r\n </li>\r\n </ul>\r\n </aside>\r\n <!-- RIGHT PANEL : CHAT WINDOW -->\r\n @if (showMessages) {\r\n <section *ngIf=\"showMessages\" @roomSwitch class=\"chat-main glass\">\r\n <app-chat-window [chatRoomId]=\"activeRoomId()\" [header]=\"activeRoomHeader()\" [metadata]=\"activeRoomMetadata()\" [showActions]=\"false\"\r\n mode=\"fullscreen\" theme=\"light\">\r\n </app-chat-window>\r\n </section>\r\n } @else {\r\n <section class=\"chat-main glass loading-container\">\r\n <div class=\"spinner\"></div>\r\n <p>Loading messages\u2026</p>\r\n </section>\r\n }\r\n\r\n</div>", styles: [":root{--glass-bg: rgba(255, 255, 255, .75);--glass-border: rgba(255, 255, 255, .25);--primary: #5b6dff;--text-dark: #1c1e21;--text-muted: #65676b}*{box-sizing:border-box;font-family:Segoe UI,system-ui,-apple-system,BlinkMacSystemFont}.chat-page{display:flex;height:100vh;padding:16px;gap:16px;background:linear-gradient(135deg,#e9efff,#f6f7fb)}.glass{background:var(--glass-bg);backdrop-filter:blur(14px);-webkit-backdrop-filter:blur(14px);border-radius:18px;border:1px solid var(--glass-border);box-shadow:0 20px 40px #00000014,inset 0 1px #fff6}.chat-sidebar{width:300px;display:flex;flex-direction:column;overflow:hidden}.sidebar-header{padding:18px 20px;font-size:18px;font-weight:700;color:var(--text-dark);border-bottom:1px solid rgba(0,0,0,.06)}.room-list{list-style:none;overflow-y:auto;padding:6px}.room-item{display:flex;align-items:center;gap:14px;padding:12px 14px;border-radius:14px;cursor:pointer;transition:all .25s ease;margin-bottom:6px}.room-item:hover{background:#5b6dff14}.room-item.active{background:#5b6dff26;box-shadow:inset 0 0 0 1px #5b6dff40}.room-avatar p-avatar{width:44px;height:44px;border-radius:50%;background:linear-gradient(135deg,#5b6dff,#7a89ff);color:#fff;font-weight:700;display:flex;align-items:center;justify-content:center}.room-info{display:flex;flex-direction:column;overflow:hidden}.room-name{font-size:14px;font-weight:600;color:var(--text-dark);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.room-info span:last-child{font-size:12px;color:var(--text-muted)}.chat-main{flex:1;display:flex;flex-direction:column;overflow:hidden;position:relative}.chat-main:after{content:\"\";position:absolute;inset:0;border-radius:18px;pointer-events:none;box-shadow:inset 0 0 0 1px #fff3}.room-item:hover{transform:translateY(-1px)}.loading-container{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%}.spinner{width:40px;height:40px;border:4px solid rgba(0,0,0,.1);border-top-color:#4f46e5;border-radius:50%;animation:spin 1s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: ToastModule }, { kind: "ngmodule", type: ButtonModule }, { kind: "ngmodule", type: AvatarModule }, { kind: "component", type: i2.Avatar, selector: "p-avatar", inputs: ["label", "icon", "image", "size", "shape", "style", "styleClass", "ariaLabel", "ariaLabelledBy"], outputs: ["onImageError"] }, { kind: "ngmodule", type: TooltipModule }, { kind: "ngmodule", type: InputTextareaModule }, { kind: "ngmodule", type: ChipModule }, { kind: "ngmodule", type: DropdownModule }, { kind: "ngmodule", type: OverlayPanelModule }, { kind: "component", type: ChatWindowComponent, selector: "app-chat-window", inputs: ["chatRoomId", "header", "metadata", "chatUsers", "showActions", "mode", "theme", "refreshRoom"], outputs: ["onArchive"] }], animations: [
82
+ trigger('roomSwitch', [
83
+ transition(':enter', [
84
+ style({ opacity: 0, transform: 'translateX(24px)' }),
85
+ animate('300ms cubic-bezier(.4,0,.2,1)', style({ opacity: 1, transform: 'translateX(0)' }))
86
+ ]),
87
+ transition(':leave', [
88
+ animate('200ms ease-in', style({ opacity: 0, transform: 'translateX(-24px)' }))
89
+ ])
90
+ ])
91
+ ] }); }
92
+ }
93
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AllChatsComponent, decorators: [{
94
+ type: Component,
95
+ args: [{ selector: 'app-all-chats', standalone: true, imports: [
96
+ CommonModule,
97
+ FormsModule,
98
+ ToastModule,
99
+ ButtonModule,
100
+ AvatarModule,
101
+ TooltipModule,
102
+ InputTextareaModule,
103
+ ChipModule,
104
+ DropdownModule,
105
+ OverlayPanelModule,
106
+ ChatWindowComponent
107
+ ], animations: [
108
+ trigger('roomSwitch', [
109
+ transition(':enter', [
110
+ style({ opacity: 0, transform: 'translateX(24px)' }),
111
+ animate('300ms cubic-bezier(.4,0,.2,1)', style({ opacity: 1, transform: 'translateX(0)' }))
112
+ ]),
113
+ transition(':leave', [
114
+ animate('200ms ease-in', style({ opacity: 0, transform: 'translateX(-24px)' }))
115
+ ])
116
+ ])
117
+ ], template: "<div class=\"chat-page\">\r\n <!-- LEFT SIDEBAR : CHAT ROOMS -->\r\n <aside class=\"chat-sidebar glass\">\r\n <div class=\"sidebar-header\">\r\n <h3>Chat Rooms</h3>\r\n </div>\r\n <ul class=\"room-list\">\r\n <li (click)=\"selectRoom(room)\" *ngFor=\"let room of rooms;\" [class.active]=\"activeRoomId() === room.ChatRoomId\"\r\n class=\"room-item\">\r\n <div class=\"room-avatar\">\r\n <p-avatar [label]=\"room.ChatRoomName[0]\"></p-avatar>\r\n </div>\r\n <div class=\"room-info\">\r\n <span class=\"room-name\">{{ room.ChatRoomName }}</span>\r\n <span class=\"room-name\">{{ room.Metadata }}</span>\r\n </div>\r\n </li>\r\n </ul>\r\n </aside>\r\n <!-- RIGHT PANEL : CHAT WINDOW -->\r\n @if (showMessages) {\r\n <section *ngIf=\"showMessages\" @roomSwitch class=\"chat-main glass\">\r\n <app-chat-window [chatRoomId]=\"activeRoomId()\" [header]=\"activeRoomHeader()\" [metadata]=\"activeRoomMetadata()\" [showActions]=\"false\"\r\n mode=\"fullscreen\" theme=\"light\">\r\n </app-chat-window>\r\n </section>\r\n } @else {\r\n <section class=\"chat-main glass loading-container\">\r\n <div class=\"spinner\"></div>\r\n <p>Loading messages\u2026</p>\r\n </section>\r\n }\r\n\r\n</div>", styles: [":root{--glass-bg: rgba(255, 255, 255, .75);--glass-border: rgba(255, 255, 255, .25);--primary: #5b6dff;--text-dark: #1c1e21;--text-muted: #65676b}*{box-sizing:border-box;font-family:Segoe UI,system-ui,-apple-system,BlinkMacSystemFont}.chat-page{display:flex;height:100vh;padding:16px;gap:16px;background:linear-gradient(135deg,#e9efff,#f6f7fb)}.glass{background:var(--glass-bg);backdrop-filter:blur(14px);-webkit-backdrop-filter:blur(14px);border-radius:18px;border:1px solid var(--glass-border);box-shadow:0 20px 40px #00000014,inset 0 1px #fff6}.chat-sidebar{width:300px;display:flex;flex-direction:column;overflow:hidden}.sidebar-header{padding:18px 20px;font-size:18px;font-weight:700;color:var(--text-dark);border-bottom:1px solid rgba(0,0,0,.06)}.room-list{list-style:none;overflow-y:auto;padding:6px}.room-item{display:flex;align-items:center;gap:14px;padding:12px 14px;border-radius:14px;cursor:pointer;transition:all .25s ease;margin-bottom:6px}.room-item:hover{background:#5b6dff14}.room-item.active{background:#5b6dff26;box-shadow:inset 0 0 0 1px #5b6dff40}.room-avatar p-avatar{width:44px;height:44px;border-radius:50%;background:linear-gradient(135deg,#5b6dff,#7a89ff);color:#fff;font-weight:700;display:flex;align-items:center;justify-content:center}.room-info{display:flex;flex-direction:column;overflow:hidden}.room-name{font-size:14px;font-weight:600;color:var(--text-dark);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.room-info span:last-child{font-size:12px;color:var(--text-muted)}.chat-main{flex:1;display:flex;flex-direction:column;overflow:hidden;position:relative}.chat-main:after{content:\"\";position:absolute;inset:0;border-radius:18px;pointer-events:none;box-shadow:inset 0 0 0 1px #fff3}.room-item:hover{transform:translateY(-1px)}.loading-container{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%}.spinner{width:40px;height:40px;border:4px solid rgba(0,0,0,.1);border-top-color:#4f46e5;border-radius:50%;animation:spin 1s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}\n"] }]
118
+ }], ctorParameters: () => [], propDecorators: { newRoomLoaded: [{
119
+ type: Output
120
+ }] } });
121
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWxsLWNoYXRzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NoYXQtd2lkZ2V0L3NyYy9saWIvYWxsLWNoYXRzL2FsbC1jaGF0cy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jaGF0LXdpZGdldC9zcmMvbGliL2FsbC1jaGF0cy9hbGwtY2hhdHMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFNBQVMsRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ3JGLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSwrQkFBK0IsQ0FBQztBQUMxRCxPQUFPLEVBQUMsbUJBQW1CLEVBQUMsTUFBTSxzQ0FBc0MsQ0FBQztBQUN6RSxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDN0MsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQzNDLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUM1QyxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDNUMsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLGNBQWMsQ0FBQztBQUN4QyxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFDaEQsT0FBTyxFQUFDLG1CQUFtQixFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFDMUQsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFDeEQsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUMxQyxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDOUMsT0FBTyxFQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUs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LEVBQUMsT0FBTyxFQUFFLENBQUMsRUFBRSxTQUFTLEVBQUUsa0JBQWtCLEVBQUMsQ0FBQztnQ0FDbEQsT0FBTyxDQUNILCtCQUErQixFQUMvQixLQUFLLENBQUMsRUFBQyxPQUFPLEVBQUUsQ0FBQyxFQUFFLFNBQVMsRUFBRSxlQUFlLEVBQUMsQ0FBQyxDQUNsRDs2QkFDSixDQUFDOzRCQUNGLFVBQVUsQ0FBQyxRQUFRLEVBQUU7Z0NBQ2pCLE9BQU8sQ0FDSCxlQUFlLEVBQ2YsS0FBSyxDQUFDLEVBQUMsT0FBTyxFQUFFLENBQUMsRUFBRSxTQUFTLEVBQUUsbUJBQW1CLEVBQUMsQ0FBQyxDQUN0RDs2QkFDSixDQUFDO3lCQUNMLENBQUM7cUJBQ0w7d0RBUVMsYUFBYTtzQkFBdEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Q29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIGluamVjdCwgaW5wdXQsIE91dHB1dCwgc2lnbmFsfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHtDaGF0U2VydmljZX0gZnJvbSAnLi4vY29yZS9zZXJ2aWNlcy9jaGF0LnNlcnZpY2UnO1xyXG5pbXBvcnQge0NoYXRXaW5kb3dDb21wb25lbnR9IGZyb20gXCIuLi9jaGF0LXdpbmRvdy9jaGF0LXdpbmRvdy5jb21wb25lbnRcIjtcclxuaW1wb3J0IHtDb21tb25Nb2R1bGV9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7Rm9ybXNNb2R1bGV9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHtBdmF0YXJNb2R1bGV9IGZyb20gJ3ByaW1lbmcvYXZhdGFyJztcclxuaW1wb3J0IHtCdXR0b25Nb2R1bGV9IGZyb20gJ3ByaW1lbmcvYnV0dG9uJztcclxuaW1wb3J0IHtDaGlwTW9kdWxlfSBmcm9tICdwcmltZW5nL2NoaXAnO1xyXG5pbXBvcnQge0Ryb3Bkb3duTW9kdWxlfSBmcm9tICdwcmltZW5nL2Ryb3Bkb3duJztcclxuaW1wb3J0IHtJbnB1dFRleHRhcmVhTW9kdWxlfSBmcm9tICdwcmltZW5nL2lucHV0dGV4dGFyZWEnO1xyXG5pbXBvcnQge092ZXJsYXlQYW5lbE1vZHVsZX0gZnJvbSAncHJpbWVuZy9vdmVybGF5cGFuZWwnO1xyXG5pbXBvcnQge1RvYXN0TW9kdWxlfSBmcm9tICdwcmltZW5nL3RvYXN0JztcclxuaW1wb3J0IHtUb29sdGlwTW9kdWxlfSBmcm9tICdwcmltZW5nL3Rvb2x0aXAnO1xyXG5pbXBvcnQge2FuaW1hdGUsIHN0eWxlLCB0cmFuc2l0aW9uLCB0cmlnZ2VyfSBmcm9tICdAYW5ndWxhci9hbmltYXRpb25zJztcclxuaW1wb3J0IHtTb2NrZXRTZXJ2aWNlfSBmcm9tICcuLi9jb3JlL3NlcnZpY2VzL3NvY2tldC5zZXJ2aWNlJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gICAgc2VsZWN0b3I6ICdhcHAtYWxsLWNoYXRzJyxcclxuICAgIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgICBpbXBvcnRzOiBbXHJcbiAgICAgICAgQ29tbW9uTW9kdWxlLFxyXG4gICAgICAgIEZvcm1zTW9kdWxlLFxyXG4gICAgICAgIFRvYXN0TW9kdWxlLFxyXG4gICAgICAgIEJ1dHRvbk1vZHVsZSxcclxuICAgICAgICBBdmF0YXJNb2R1bGUsXHJcbiAgICAgICAgVG9vbHRpcE1vZHVsZSxcclxuICAgICAgICBJbnB1dFRleHRhcmVhTW9kdWxlLFxyXG4gICAgICAgIENoaXBNb2R1bGUsXHJcbiAgICAgICAgRHJvcGRvd25Nb2R1bGUsXHJcbiAgICAgICAgT3ZlcmxheVBhbmVsTW9kdWxlLFxyXG4gICAgICAgIENoYXRXaW5kb3dDb21wb25lbnRcclxuICAgIF0sXHJcbiAgICB0ZW1wbGF0ZVVybDogJy4vYWxsLWNoYXRzLmNvbXBvbmVudC5odG1sJyxcclxuICAgIHN0eWxlVXJsOiAnLi9hbGwtY2hhdHMuY29tcG9uZW50LnNjc3MnLFxyXG4gICAgYW5pbWF0aW9uczogW1xyXG4gICAgICAgIHRyaWdnZXIoJ3Jvb21Td2l0Y2gnLCBbXHJcbiAgICAgICAgICAgIHRyYW5zaXRpb24oJzplbnRlcicsIFtcclxuICAgICAgICAgICAgICAgIHN0eWxlKHtvcGFjaXR5OiAwLCB0cmFuc2Zvcm06ICd0cmFuc2xhdGVYKDI0cHgpJ30pLFxyXG4gICAgICAgICAgICAgICAgYW5pbWF0ZShcclxuICAgICAgICAgICAgICAgICAgICAnMzAwbXMgY3ViaWMtYmV6aWVyKC40LDAsLjIsMSknLFxyXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlKHtvcGFjaXR5OiAxLCB0cmFuc2Zvcm06ICd0cmFuc2xhdGVYKDApJ30pXHJcbiAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgIF0pLFxyXG4gICAgICAgICAgICB0cmFuc2l0aW9uKCc6bGVhdmUnLCBbXHJcbiAgICAgICAgICAgICAgICBhbmltYXRlKFxyXG4gICAgICAgICAgICAgICAgICAgICcyMDBtcyBlYXNlLWluJyxcclxuICAgICAgICAgICAgICAgICAgICBzdHlsZSh7b3BhY2l0eTogMCwgdHJhbnNmb3JtOiAndHJhbnNsYXRlWCgtMjRweCknfSlcclxuICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgXSlcclxuICAgICAgICBdKVxyXG4gICAgXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgQWxsQ2hhdHNDb21wb25lbnQge1xyXG5cclxuICAgIHVzZXIgPSBpbnB1dDxhbnk+KG51bGwpO1xyXG4gICAgcm9vbUlkID0gaW5wdXQ8YW55PihudWxsKTtcclxuICAgIGNoYXRVc2VycyA9IHNpZ25hbDxhbnlbXT4oW10pO1xyXG5cclxuICAgIEBPdXRwdXQoKSBuZXdSb29tTG9hZGVkID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG5cclxuICAgIHJvb21zOiBhbnlbXSA9IFtdO1xyXG4gICAgYWN0aXZlUm9vbUlkID0gc2lnbmFsPHN0cmluZz4oJycpO1xyXG4gICAgYWN0aXZlUm9vbUhlYWRlciA9IHNpZ25hbDxzdHJpbmc+KCcnKTtcclxuICAgIGFjdGl2ZVJvb21NZXRhZGF0YSA9IHNpZ25hbDxzdHJpbmc+KCcnKTtcclxuXHJcbiAgICBjaGF0U2VydmljZSA9IGluamVjdChDaGF0U2VydmljZSk7XHJcbiAgICBzb2NrZXRTZXJ2aWNlID0gaW5qZWN0KFNvY2tldFNlcnZpY2UpO1xyXG4gICAgc2hvd01lc3NhZ2VzOiBib29sZWFuID0gZmFsc2VcclxuXHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgIH1cclxuXHJcbiAgICBuZ09uSW5pdCgpIHtcclxuICAgICAgICBpZiAoIXRoaXMudXNlcikge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCd1c2VyIGlzIHJlcXVpcmVkJyk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuY2hhdFNlcnZpY2UuY3VycmVudFVzZXIuc2V0KHtcclxuICAgICAgICAgICAgcm9vbUlkOiB0aGlzLmFjdGl2ZVJvb21JZCxcclxuICAgICAgICAgICAgdXNlcklkOiB0aGlzLnVzZXIoKT8uaWQsXHJcbiAgICAgICAgICAgIG5hbWU6IHRoaXMudXNlcigpPy5uYW1lXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuc29ja2V0U2VydmljZS5jb25uZWN0KHRoaXMudXNlcigpLmlkKTtcclxuXHJcbiAgICAgICAgdGhpcy5jaGF0U2VydmljZS5nZXRSb29tcyh0aGlzLnVzZXIoKT8uaWQsIHRoaXMucm9vbUlkKCkpLnN1YnNjcmliZShyZXMgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnJvb21zID0gcmVzO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5yb29tcy5sZW5ndGggIT0gMCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RSb29tKHRoaXMucm9vbXNbMF0pO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hY3RpdmVSb29tSWQuc2V0KHRoaXMucm9vbXNbMF0uQ2hhdFJvb21JZCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmFjdGl2ZVJvb21IZWFkZXIuc2V0KHRoaXMucm9vbXNbMF0uQ2hhdFJvb21OYW1lKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuYWN0aXZlUm9vbU1ldGFkYXRhLnNldCh0aGlzLnJvb21zWzBdLk1ldGFkYXRhKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2hhdFNlcnZpY2UuYWRkVXNlclRvUm9vbShcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJvb21JZCgpLFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXNlcigpPy5pZCxcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnVzZXIoKT8ubmFtZSxcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNoYXRTZXJ2aWNlLmN1cnJlbnRVc2VyKCkudXNlcklkKS5zdWJzY3JpYmUoKHJlcykgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucm9vbXMgPSBbXTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmdldFJvb21zKCk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGdldFJvb21zKCkge1xyXG4gICAgICAgIHRoaXMuY2hhdFNlcnZpY2UuZ2V0Um9vbXModGhpcy51c2VyKCk/LmlkLCB0aGlzLnJvb21JZCgpKS5zdWJzY3JpYmUocmVzID0+IHtcclxuICAgICAgICAgICAgdGhpcy5yb29tcyA9IHJlcztcclxuICAgICAgICAgICAgaWYgKHRoaXMucm9vbXMubGVuZ3RoICE9IDApIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0Um9vbSh0aGlzLnJvb21zWzBdKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuYWN0aXZlUm9vbUlkLnNldCh0aGlzLnJvb21zWzBdLkNoYXRSb29tSWQpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hY3RpdmVSb29tSGVhZGVyLnNldCh0aGlzLnJvb21zWzBdLkNoYXRSb29tTmFtZSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmFjdGl2ZVJvb21NZXRhZGF0YS5zZXQodGhpcy5yb29tc1swXS5NZXRhZGF0YSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBzZWxlY3RSb29tKHJvb206IGFueSkge1xyXG4gICAgICAgIHRoaXMuc2hvd01lc3NhZ2VzID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5hY3RpdmVSb29tSWQuc2V0KHJvb20uQ2hhdFJvb21JZCk7XHJcbiAgICAgICAgdGhpcy5hY3RpdmVSb29tSGVhZGVyLnNldChyb29tLkNoYXRSb29tTmFtZSk7XHJcbiAgICAgICAgdGhpcy5hY3RpdmVSb29tTWV0YWRhdGEuc2V0KHJvb20uTWV0YWRhdGEpO1xyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnNob3dNZXNzYWdlcyA9IHRydWU7XHJcbiAgICAgICAgfSwgODAwKTtcclxuICAgIH1cclxufVxyXG4iLCI8ZGl2IGNsYXNzPVwiY2hhdC1wYWdlXCI+XHJcbiAgICA8IS0tIExFRlQgU0lERUJBUiA6IENIQVQgUk9PTVMgLS0+XHJcbiAgICA8YXNpZGUgY2xhc3M9XCJjaGF0LXNpZGViYXIgZ2xhc3NcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic2lkZWJhci1oZWFkZXJcIj5cclxuICAgICAgICAgICAgPGgzPkNoYXQgUm9vbXM8L2gzPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDx1bCBjbGFzcz1cInJvb20tbGlzdFwiPlxyXG4gICAgICAgICAgICA8bGkgKGNsaWNrKT1cInNlbGVjdFJvb20ocm9vbSlcIiAqbmdGb3I9XCJsZXQgcm9vbSBvZiByb29tcztcIiBbY2xhc3MuYWN0aXZlXT1cImFjdGl2ZVJvb21JZCgpID09PSByb29tLkNoYXRSb29tSWRcIlxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJyb29tLWl0ZW1cIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb29tLWF2YXRhclwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxwLWF2YXRhciBbbGFiZWxdPVwicm9vbS5DaGF0Um9vbU5hbWVbMF1cIj48L3AtYXZhdGFyPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm9vbS1pbmZvXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJyb29tLW5hbWVcIj57eyByb29tLkNoYXRSb29tTmFtZSB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJvb20tbmFtZVwiPnt7IHJvb20uTWV0YWRhdGEgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9saT5cclxuICAgICAgICA8L3VsPlxyXG4gICAgPC9hc2lkZT5cclxuICAgIDwhLS0gUklHSFQgUEFORUwgOiBDSEFUIFdJTkRPVyAtLT5cclxuICAgIEBpZiAoc2hvd01lc3NhZ2VzKSB7XHJcbiAgICAgICAgPHNlY3Rpb24gKm5nSWY9XCJzaG93TWVzc2FnZXNcIiBAcm9vbVN3aXRjaCBjbGFzcz1cImNoYXQtbWFpbiBnbGFzc1wiPlxyXG4gICAgICAgICAgICA8YXBwLWNoYXQtd2luZG93IFtjaGF0Um9vbUlkXT1cImFjdGl2ZVJvb21JZCgpXCIgW2hlYWRlcl09XCJhY3RpdmVSb29tSGVhZGVyKClcIiBbbWV0YWRhdGFdPVwiYWN0aXZlUm9vbU1ldGFkYXRhKClcIiBbc2hvd0FjdGlvbnNdPVwiZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGU9XCJmdWxsc2NyZWVuXCIgdGhlbWU9XCJsaWdodFwiPlxyXG4gICAgICAgICAgICA8L2FwcC1jaGF0LXdpbmRvdz5cclxuICAgICAgICA8L3NlY3Rpb24+XHJcbiAgICB9IEBlbHNlIHtcclxuICAgICAgICA8c2VjdGlvbiBjbGFzcz1cImNoYXQtbWFpbiBnbGFzcyBsb2FkaW5nLWNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Bpbm5lclwiPjwvZGl2PlxyXG4gICAgICAgICAgICA8cD5Mb2FkaW5nIG1lc3NhZ2Vz4oCmPC9wPlxyXG4gICAgICAgIDwvc2VjdGlvbj5cclxuICAgIH1cclxuXHJcbjwvZGl2PiJdfQ==
@@ -0,0 +1,96 @@
1
+ import { Component, effect, inject, input, signal, ViewEncapsulation } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+ import { ChatWindowComponent } from '../chat-window/chat-window.component';
4
+ import { ChatService } from '../core/services/chat.service';
5
+ import { DropdownModule } from 'primeng/dropdown';
6
+ import { ButtonModule } from 'primeng/button';
7
+ import { ToastModule } from 'primeng/toast';
8
+ import { MessageService } from 'primeng/api';
9
+ import { FormsModule } from '@angular/forms';
10
+ import { TabViewModule } from 'primeng/tabview';
11
+ import { SocketService } from '../core/services/socket.service';
12
+ import { TooltipModule } from "primeng/tooltip";
13
+ import * as i0 from "@angular/core";
14
+ import * as i1 from "@angular/common";
15
+ import * as i2 from "primeng/api";
16
+ import * as i3 from "primeng/button";
17
+ import * as i4 from "primeng/tabview";
18
+ import * as i5 from "primeng/tooltip";
19
+ export class ChatLauncherComponent {
20
+ constructor() {
21
+ this.roomId = input('');
22
+ this.roomHeader = input('');
23
+ this.metadata = input('');
24
+ this.user = input(null);
25
+ this.userList = input([]);
26
+ this.chatUsers = input([]);
27
+ this.chatService = inject(ChatService);
28
+ this.socketService = inject(SocketService);
29
+ this.messageService = inject(MessageService);
30
+ this.openWindows = signal([]);
31
+ this.lastOpenedRoom = signal(null);
32
+ this.activeIndex = signal(0);
33
+ this.isVisible = signal(true);
34
+ effect(() => {
35
+ const roomId = this.roomId();
36
+ const header = this.roomHeader();
37
+ const metadata = this.metadata();
38
+ const user = this.user();
39
+ this.chatService.currentUser.set({
40
+ roomId: this.roomId(),
41
+ userId: user?.userId,
42
+ name: user?.name
43
+ });
44
+ this.chatService.userList.set(this.userList());
45
+ if (!roomId || !user?.userId)
46
+ return;
47
+ if (this.lastOpenedRoom() === roomId)
48
+ return;
49
+ this.lastOpenedRoom.set(roomId);
50
+ this.openNewRoom(roomId, header, metadata, user.userId, user.name, this.chatUsers());
51
+ }, { allowSignalWrites: true });
52
+ }
53
+ ngOnInit() {
54
+ console.log('ChatLauncher initialized');
55
+ }
56
+ openNewRoom(roomId, roomHeader, metadata, userId, username, chatUsers) {
57
+ this.isVisible.set(true);
58
+ this.chatService.createRoom(roomId, roomHeader, metadata, userId, username, chatUsers).subscribe(room => {
59
+ this.addWindow(room.roomKey, room.name, room.metadata);
60
+ });
61
+ }
62
+ addWindow(roomId, header, metadata) {
63
+ const windows = this.openWindows();
64
+ const existingIndex = windows.findIndex(w => w.roomId === roomId);
65
+ // already open → focus
66
+ if (existingIndex !== -1) {
67
+ this.activeIndex.set(existingIndex);
68
+ return;
69
+ }
70
+ const newIndex = windows.length;
71
+ this.openWindows.update(ws => [...ws, { roomId, header, metadata }]);
72
+ // ✅ force real change: -1 → 0
73
+ setTimeout(() => {
74
+ this.activeIndex.set(newIndex);
75
+ }, 500);
76
+ }
77
+ closeWindow(roomId) {
78
+ this.openWindows.update(ws => ws.filter(w => w.roomId !== roomId));
79
+ }
80
+ setActive(i) {
81
+ this.activeIndex.set(i);
82
+ }
83
+ closeAll() {
84
+ this.openWindows.set([]);
85
+ // this.lastOpenedRoom.set(null);
86
+ // this.activeIndex.set(0);
87
+ this.isVisible.set(false);
88
+ }
89
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ChatLauncherComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
90
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: ChatLauncherComponent, isStandalone: true, selector: "app-chat-launcher", inputs: { roomId: { classPropertyName: "roomId", publicName: "roomId", isSignal: true, isRequired: false, transformFunction: null }, roomHeader: { classPropertyName: "roomHeader", publicName: "roomHeader", isSignal: true, isRequired: false, transformFunction: null }, metadata: { classPropertyName: "metadata", publicName: "metadata", isSignal: true, isRequired: false, transformFunction: null }, user: { classPropertyName: "user", publicName: "user", isSignal: true, isRequired: false, transformFunction: null }, userList: { classPropertyName: "userList", publicName: "userList", isSignal: true, isRequired: false, transformFunction: null }, chatUsers: { classPropertyName: "chatUsers", publicName: "chatUsers", isSignal: true, isRequired: false, transformFunction: null } }, providers: [MessageService], ngImport: i0, template: "@if (isVisible()) {\r\n <div class=\"chat-float-wrapper\">\r\n <button (click)=\"closeAll()\" icon=\"pi pi-times\" pButton pTooltip=\"Close\"\r\n style=\"font-size: 0.5rem\" class=\"closeButton\"></button>\r\n <p-tabView (activeIndexChange)=\"setActive($event)\" [activeIndex]=\"activeIndex()\" [scrollable]=\"true\"\r\n class=\"chat-tabview\">\r\n <p-tabPanel *ngFor=\"let w of openWindows(); let i = index\" [header]=\"w.header\">\r\n <ng-template pTemplate=\"content\">\r\n <app-chat-window (onArchive)=\"closeWindow($event)\"\r\n [chatRoomId]=\"w.roomId\" [header]=\"w.header\"\r\n [metadata]=\"w.metadata\" mode=\"floating\" theme=\"light\">\r\n </app-chat-window>\r\n </ng-template>\r\n </p-tabPanel>\r\n </p-tabView>\r\n </div>\r\n}\r\n", styles: ["@charset \"UTF-8\";.chat-float-wrapper{position:fixed!important;bottom:16px!important;right:16px!important;z-index:99999;pointer-events:auto}:host{position:fixed;right:16px;bottom:16px;z-index:2147483647;font-family:Arial,sans-serif}:host,:host *{box-sizing:border-box}:host{isolation:isolate}.chat-tabview{width:100%;height:100%}:host ::ng-deep .p-tabview{height:100%;display:flex;flex-direction:column}:host ::ng-deep .p-tabview-nav{flex-shrink:0}:host ::ng-deep .p-tabview-panels{flex:1;overflow:hidden}:host ::ng-deep .p-tabview-panel{height:100%}:host ::ng-deep app-chat-window{display:block;height:100%}.chat-tabview ::ng-deep .p-tabview-nav{background:transparent;border:none;display:flex;gap:8px;padding:6px 4px}.chat-tabview ::ng-deep .p-tabview-nav li{border:none}.chat-tabview ::ng-deep .p-tabview-nav li .p-tabview-nav-link{border:none;border-radius:18px;padding:6px 14px;font-size:13px;font-weight:500;color:#555;box-shadow:0 1px 4px #00000014;transition:all .2s ease;background:#d3d3d3}.chat-tabview ::ng-deep .p-tabview-nav li .p-tabview-nav-link:hover{color:#1a73e8}.chat-tabview ::ng-deep .p-tabview-nav li.p-highlight .p-tabview-nav-link{background:#1a73e8;color:#fff;box-shadow:0 4px 10px #1a73e859;border-bottom:outset;border-color:#1a73e8}.chat-tabview ::ng-deep .p-tabview-ink-bar{display:none}.chat-tabview ::ng-deep .p-tabview-panels{padding:0;border:none;background:transparent}.closeButton{position:absolute;right:0;top:25px;border-radius:50%;border:solid 2px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: ChatWindowComponent, selector: "app-chat-window", inputs: ["chatRoomId", "header", "metadata", "chatUsers", "showActions", "mode", "theme", "refreshRoom"], outputs: ["onArchive"] }, { kind: "ngmodule", type: DropdownModule }, { kind: "directive", type: i2.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "directive", type: i3.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading", "severity", "raised", "rounded", "text", "outlined", "size", "plain"] }, { kind: "ngmodule", type: ToastModule }, { kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: TabViewModule }, { kind: "component", type: i4.TabView, selector: "p-tabView", inputs: ["style", "styleClass", "controlClose", "scrollable", "activeIndex", "selectOnFocus", "nextButtonAriaLabel", "prevButtonAriaLabel", "autoHideButtons", "tabindex"], outputs: ["onChange", "onClose", "activeIndexChange"] }, { kind: "component", type: i4.TabPanel, selector: "p-tabPanel", inputs: ["closable", "headerStyle", "headerStyleClass", "cache", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "selected", "disabled", "header", "leftIcon", "rightIcon"] }, { kind: "ngmodule", type: TooltipModule }, { kind: "directive", type: i5.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "pTooltip", "tooltipDisabled", "tooltipOptions"] }] }); }
91
+ }
92
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ChatLauncherComponent, decorators: [{
93
+ type: Component,
94
+ args: [{ selector: 'app-chat-launcher', standalone: true, imports: [CommonModule, ChatWindowComponent, DropdownModule, ButtonModule, ToastModule, FormsModule, TabViewModule, TooltipModule], providers: [MessageService], encapsulation: ViewEncapsulation.Emulated, template: "@if (isVisible()) {\r\n <div class=\"chat-float-wrapper\">\r\n <button (click)=\"closeAll()\" icon=\"pi pi-times\" pButton pTooltip=\"Close\"\r\n style=\"font-size: 0.5rem\" class=\"closeButton\"></button>\r\n <p-tabView (activeIndexChange)=\"setActive($event)\" [activeIndex]=\"activeIndex()\" [scrollable]=\"true\"\r\n class=\"chat-tabview\">\r\n <p-tabPanel *ngFor=\"let w of openWindows(); let i = index\" [header]=\"w.header\">\r\n <ng-template pTemplate=\"content\">\r\n <app-chat-window (onArchive)=\"closeWindow($event)\"\r\n [chatRoomId]=\"w.roomId\" [header]=\"w.header\"\r\n [metadata]=\"w.metadata\" mode=\"floating\" theme=\"light\">\r\n </app-chat-window>\r\n </ng-template>\r\n </p-tabPanel>\r\n </p-tabView>\r\n </div>\r\n}\r\n", styles: ["@charset \"UTF-8\";.chat-float-wrapper{position:fixed!important;bottom:16px!important;right:16px!important;z-index:99999;pointer-events:auto}:host{position:fixed;right:16px;bottom:16px;z-index:2147483647;font-family:Arial,sans-serif}:host,:host *{box-sizing:border-box}:host{isolation:isolate}.chat-tabview{width:100%;height:100%}:host ::ng-deep .p-tabview{height:100%;display:flex;flex-direction:column}:host ::ng-deep .p-tabview-nav{flex-shrink:0}:host ::ng-deep .p-tabview-panels{flex:1;overflow:hidden}:host ::ng-deep .p-tabview-panel{height:100%}:host ::ng-deep app-chat-window{display:block;height:100%}.chat-tabview ::ng-deep .p-tabview-nav{background:transparent;border:none;display:flex;gap:8px;padding:6px 4px}.chat-tabview ::ng-deep .p-tabview-nav li{border:none}.chat-tabview ::ng-deep .p-tabview-nav li .p-tabview-nav-link{border:none;border-radius:18px;padding:6px 14px;font-size:13px;font-weight:500;color:#555;box-shadow:0 1px 4px #00000014;transition:all .2s ease;background:#d3d3d3}.chat-tabview ::ng-deep .p-tabview-nav li .p-tabview-nav-link:hover{color:#1a73e8}.chat-tabview ::ng-deep .p-tabview-nav li.p-highlight .p-tabview-nav-link{background:#1a73e8;color:#fff;box-shadow:0 4px 10px #1a73e859;border-bottom:outset;border-color:#1a73e8}.chat-tabview ::ng-deep .p-tabview-ink-bar{display:none}.chat-tabview ::ng-deep .p-tabview-panels{padding:0;border:none;background:transparent}.closeButton{position:absolute;right:0;top:25px;border-radius:50%;border:solid 2px}\n"] }]
95
+ }], ctorParameters: () => [] });
96
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhdC1sYXVuY2hlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jaGF0LXdpZGdldC9zcmMvbGliL2NoYXQtbGF1bmNoZXIvY2hhdC1sYXVuY2hlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jaGF0LXdpZGdldC9zcmMvbGliL2NoYXQtbGF1bmNoZXIvY2hhdC1sYXVuY2hlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsU0FBUyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxpQkFBaUIsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUMxRixPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDN0MsT0FBTyxFQUFDLG1CQUFtQixFQUFDLE1BQU0sc0NBQXNDLENBQUM7QUFDekUsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLCtCQUErQixDQUFDO0FBQzFELE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQztBQUNoRCxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDNUMsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUMxQyxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBQzNDLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzQyxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDOUMsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLGlDQUFpQyxDQUFDO0FBQzlELE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQzs7Ozs7OztBQWlCOUMsTUFBTSxPQUFPLHFCQUFxQjtJQWlCOUI7UUFmQSxXQUFNLEdBQUcsS0FBSyxDQUFT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QUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM5QixDQUFDOytHQXhGUSxxQkFBcUI7bUdBQXJCLHFCQUFxQix5MEJBSG5CLENBQUMsY0FBYyxDQUFDLDBCQ3pCL0IsdThCQWlCQSx5Z0RES2MsWUFBWSw0SkFBRSxtQkFBbUIsNkxBQUUsY0FBYyxxSUFBRSxZQUFZLDRPQUFFLFdBQVcsOEJBQUUsV0FBVyw4QkFBRSxhQUFhLDJrQkFBRSxhQUFhOzs0RkFNeEgscUJBQXFCO2tCQVRqQyxTQUFTOytCQUNJLG1CQUFtQixjQUNqQixJQUFJLFdBQ1AsQ0FBQyxZQUFZLEVBQUUsbUJBQW1CLEVBQUUsY0FBYyxFQUFFLFlBQVksRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLGFBQWEsRUFBRSxhQUFhLENBQUMsYUFHdkgsQ0FBQyxjQUFjLENBQUMsaUJBQ1osaUJBQWlCLENBQUMsUUFBUSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Q29tcG9uZW50LCBlZmZlY3QsIGluamVjdCwgaW5wdXQsIHNpZ25hbCwgVmlld0VuY2Fwc3VsYXRpb259IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQge0NvbW1vbk1vZHVsZX0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHtDaGF0V2luZG93Q29tcG9uZW50fSBmcm9tICcuLi9jaGF0LXdpbmRvdy9jaGF0LXdpbmRvdy5jb21wb25lbnQnO1xyXG5pbXBvcnQge0NoYXRTZXJ2aWNlfSBmcm9tICcuLi9jb3JlL3NlcnZpY2VzL2NoYXQuc2VydmljZSc7XHJcbmltcG9ydCB7RHJvcGRvd25Nb2R1bGV9IGZyb20gJ3ByaW1lbmcvZHJvcGRvd24nO1xyXG5pbXBvcnQge0J1dHRvbk1vZHVsZX0gZnJvbSAncHJpbWVuZy9idXR0b24nO1xyXG5pbXBvcnQge1RvYXN0TW9kdWxlfSBmcm9tICdwcmltZW5nL3RvYXN0JztcclxuaW1wb3J0IHtNZXNzYWdlU2VydmljZX0gZnJvbSAncHJpbWVuZy9hcGknO1xyXG5pbXBvcnQge0Zvcm1zTW9kdWxlfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7VGFiVmlld01vZHVsZX0gZnJvbSAncHJpbWVuZy90YWJ2aWV3JztcclxuaW1wb3J0IHtTb2NrZXRTZXJ2aWNlfSBmcm9tICcuLi9jb3JlL3NlcnZpY2VzL3NvY2tldC5zZXJ2aWNlJztcclxuaW1wb3J0IHtUb29sdGlwTW9kdWxlfSBmcm9tIFwicHJpbWVuZy90b29sdGlwXCI7XHJcblxyXG5pbnRlcmZhY2UgT3BlbkNoYXRXaW5kb3cge1xyXG4gICAgcm9vbUlkOiBzdHJpbmc7XHJcbiAgICBoZWFkZXI6IHN0cmluZztcclxuICAgIG1ldGFkYXRhOiBzdHJpbmc7XHJcbn1cclxuXHJcbkBDb21wb25lbnQoe1xyXG4gICAgc2VsZWN0b3I6ICdhcHAtY2hhdC1sYXVuY2hlcicsXHJcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gICAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgQ2hhdFdpbmRvd0NvbXBvbmVudCwgRHJvcGRvd25Nb2R1bGUsIEJ1dHRvbk1vZHVsZSwgVG9hc3RNb2R1bGUsIEZvcm1zTW9kdWxlLCBUYWJWaWV3TW9kdWxlLCBUb29sdGlwTW9kdWxlXSxcclxuICAgIHRlbXBsYXRlVXJsOiAnLi9jaGF0LWxhdW5jaGVyLmNvbXBvbmVudC5odG1sJyxcclxuICAgIHN0eWxlVXJsczogWycuL2NoYXQtbGF1bmNoZXIuY29tcG9uZW50LnNjc3MnXSxcclxuICAgIHByb3ZpZGVyczogW01lc3NhZ2VTZXJ2aWNlXSxcclxuICAgIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLkVtdWxhdGVkLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgQ2hhdExhdW5jaGVyQ29tcG9uZW50IHtcclxuXHJcbiAgICByb29tSWQgPSBpbnB1dDxzdHJpbmc+KCcnKTtcclxuICAgIHJvb21IZWFkZXIgPSBpbnB1dDxzdHJpbmc+KCcnKTtcclxuICAgIG1ldGFkYXRhID0gaW5wdXQ8c3RyaW5nPignJyk7XHJcbiAgICB1c2VyID0gaW5wdXQ8YW55PihudWxsKTtcclxuICAgIHVzZXJMaXN0ID0gaW5wdXQ8YW55W10+KFtdKTtcclxuICAgIGNoYXRVc2VycyA9IGlucHV0PGFueVtdPihbXSk7XHJcblxyXG4gICAgY2hhdFNlcnZpY2UgPSBpbmplY3QoQ2hhdFNlcnZpY2UpO1xyXG4gICAgc29ja2V0U2VydmljZSA9IGluamVjdChTb2NrZXRTZXJ2aWNlKTtcclxuICAgIG1lc3NhZ2VTZXJ2aWNlID0gaW5qZWN0KE1lc3NhZ2VTZXJ2aWNlKTtcclxuICAgIG9wZW5XaW5kb3dzID0gc2lnbmFsPE9wZW5DaGF0V2luZG93W10+KFtdKTtcclxuICAgIGxhc3RPcGVuZWRSb29tID0gc2lnbmFsPHN0cmluZyB8IG51bGw+KG51bGwpO1xyXG4gICAgYWN0aXZlSW5kZXggPSBzaWduYWwoMCk7XHJcbiAgICBpc1Zpc2libGUgPSBzaWduYWwodHJ1ZSk7XHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgZWZmZWN0KFxyXG4gICAgICAgICAgICAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCByb29tSWQgPSB0aGlzLnJvb21JZCgpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaGVhZGVyID0gdGhpcy5yb29tSGVhZGVyKCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBtZXRhZGF0YSA9IHRoaXMubWV0YWRhdGEoKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHVzZXIgPSB0aGlzLnVzZXIoKTtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLmNoYXRTZXJ2aWNlLmN1cnJlbnRVc2VyLnNldCh7XHJcbiAgICAgICAgICAgICAgICAgICAgcm9vbUlkOiB0aGlzLnJvb21JZCgpLFxyXG4gICAgICAgICAgICAgICAgICAgIHVzZXJJZDogdXNlcj8udXNlcklkLFxyXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IHVzZXI/Lm5hbWVcclxuICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuY2hhdFNlcnZpY2UudXNlckxpc3Quc2V0KHRoaXMudXNlckxpc3QoKSk7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKCFyb29tSWQgfHwgIXVzZXI/LnVzZXJJZCkgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMubGFzdE9wZW5lZFJvb20oKSA9PT0gcm9vbUlkKSByZXR1cm47XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5sYXN0T3BlbmVkUm9vbS5zZXQocm9vbUlkKTtcclxuICAgICAgICAgICAgICAgIHRoaXMub3Blbk5ld1Jvb20ocm9vbUlkLCBoZWFkZXIsIG1ldGFkYXRhLCB1c2VyLnVzZXJJZCwgdXNlci5uYW1lLCB0aGlzLmNoYXRVc2VycygpKTtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAge2FsbG93U2lnbmFsV3JpdGVzOiB0cnVlfVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgbmdPbkluaXQoKSB7XHJcbiAgICAgICAgY29uc29sZS5sb2coJ0NoYXRMYXVuY2hlciBpbml0aWFsaXplZCcpO1xyXG4gICAgfVxyXG5cclxuICAgIG9wZW5OZXdSb29tKHJvb21JZDogc3RyaW5nLCByb29tSGVhZGVyOiBzdHJpbmcsIG1ldGFkYXRhOiBzdHJpbmcsIHVzZXJJZDogc3RyaW5nLCB1c2VybmFtZTogc3RyaW5nLCBjaGF0VXNlcnM6IGFueSkge1xyXG4gICAgICAgIHRoaXMuaXNWaXNpYmxlLnNldCh0cnVlKTtcclxuICAgICAgICB0aGlzLmNoYXRTZXJ2aWNlLmNyZWF0ZVJvb20ocm9vbUlkLCByb29tSGVhZGVyLCBtZXRhZGF0YSwgdXNlcklkLCB1c2VybmFtZSwgY2hhdFVzZXJzKS5zdWJzY3JpYmUocm9vbSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuYWRkV2luZG93KHJvb20ucm9vbUtleSwgcm9vbS5uYW1lLCByb29tLm1ldGFkYXRhKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBhZGRXaW5kb3cocm9vbUlkOiBzdHJpbmcsIGhlYWRlcjogc3RyaW5nLCBtZXRhZGF0YTogc3RyaW5nKSB7XHJcbiAgICAgICAgY29uc3Qgd2luZG93cyA9IHRoaXMub3BlbldpbmRvd3MoKTtcclxuICAgICAgICBjb25zdCBleGlzdGluZ0luZGV4ID0gd2luZG93cy5maW5kSW5kZXgodyA9PiB3LnJvb21JZCA9PT0gcm9vbUlkKTtcclxuXHJcbiAgICAgICAgLy8gYWxyZWFkeSBvcGVuIOKGkiBmb2N1c1xyXG4gICAgICAgIGlmIChleGlzdGluZ0luZGV4ICE9PSAtMSkge1xyXG4gICAgICAgICAgICB0aGlzLmFjdGl2ZUluZGV4LnNldChleGlzdGluZ0luZGV4KTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgbmV3SW5kZXggPSB3aW5kb3dzLmxlbmd0aDtcclxuXHJcbiAgICAgICAgdGhpcy5vcGVuV2luZG93cy51cGRhdGUod3MgPT4gWy4uLndzLCB7cm9vbUlkLCBoZWFkZXIsIG1ldGFkYXRhfV0pO1xyXG5cclxuICAgICAgICAvLyDinIUgZm9yY2UgcmVhbCBjaGFuZ2U6IC0xIOKGkiAwXHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuYWN0aXZlSW5kZXguc2V0KG5ld0luZGV4KTtcclxuICAgICAgICB9LCA1MDApO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBjbG9zZVdpbmRvdyhyb29tSWQ6IGFueSkge1xyXG4gICAgICAgIHRoaXMub3BlbldpbmRvd3MudXBkYXRlKHdzID0+IHdzLmZpbHRlcih3ID0+IHcucm9vbUlkICE9PSByb29tSWQpKTtcclxuICAgIH1cclxuXHJcbiAgICBzZXRBY3RpdmUoaTogbnVtYmVyKSB7XHJcbiAgICAgICAgdGhpcy5hY3RpdmVJbmRleC5zZXQoaSk7XHJcbiAgICB9XHJcblxyXG4gICAgY2xvc2VBbGwoKSB7XHJcbiAgICAgICAgdGhpcy5vcGVuV2luZG93cy5zZXQoW10pO1xyXG4gICAgICAgIC8vIHRoaXMubGFzdE9wZW5lZFJvb20uc2V0KG51bGwpO1xyXG4gICAgICAgIC8vIHRoaXMuYWN0aXZlSW5kZXguc2V0KDApO1xyXG4gICAgICAgIHRoaXMuaXNWaXNpYmxlLnNldChmYWxzZSk7XHJcbiAgICB9XHJcblxyXG59XHJcbiIsIkBpZiAoaXNWaXNpYmxlKCkpIHtcclxuICAgIDxkaXYgY2xhc3M9XCJjaGF0LWZsb2F0LXdyYXBwZXJcIj5cclxuICAgICAgICA8YnV0dG9uIChjbGljayk9XCJjbG9zZUFsbCgpXCIgaWNvbj1cInBpIHBpLXRpbWVzXCIgcEJ1dHRvbiBwVG9vbHRpcD1cIkNsb3NlXCJcclxuICAgICAgICAgICAgICAgIHN0eWxlPVwiZm9udC1zaXplOiAwLjVyZW1cIiBjbGFzcz1cImNsb3NlQnV0dG9uXCI+PC9idXR0b24+XHJcbiAgICAgICAgPHAtdGFiVmlldyAoYWN0aXZlSW5kZXhDaGFuZ2UpPVwic2V0QWN0aXZlKCRldmVudClcIiBbYWN0aXZlSW5kZXhdPVwiYWN0aXZlSW5kZXgoKVwiIFtzY3JvbGxhYmxlXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjaGF0LXRhYnZpZXdcIj5cclxuICAgICAgICAgICAgPHAtdGFiUGFuZWwgKm5nRm9yPVwibGV0IHcgb2Ygb3BlbldpbmRvd3MoKTsgbGV0IGkgPSBpbmRleFwiIFtoZWFkZXJdPVwidy5oZWFkZXJcIj5cclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJjb250ZW50XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGFwcC1jaGF0LXdpbmRvdyAob25BcmNoaXZlKT1cImNsb3NlV2luZG93KCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NoYXRSb29tSWRdPVwidy5yb29tSWRcIiBbaGVhZGVyXT1cIncuaGVhZGVyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttZXRhZGF0YV09XCJ3Lm1ldGFkYXRhXCIgbW9kZT1cImZsb2F0aW5nXCIgdGhlbWU9XCJsaWdodFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvYXBwLWNoYXQtd2luZG93PlxyXG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgPC9wLXRhYlBhbmVsPlxyXG4gICAgICAgIDwvcC10YWJWaWV3PlxyXG4gICAgPC9kaXY+XHJcbn1cclxuIl19
@@ -0,0 +1,69 @@
1
+ import { Component, computed, EventEmitter, inject, input, Output } from '@angular/core';
2
+ import { ChatService } from "../core/services/chat.service";
3
+ import { CommonModule } from "@angular/common";
4
+ import { FormsModule } from "@angular/forms";
5
+ import { SocketService } from "../core/services/socket.service";
6
+ import { ChatLauncherComponent } from "../chat-launcher/chat-launcher.component";
7
+ import * as i0 from "@angular/core";
8
+ export class ChatWidgetNotificationComponent {
9
+ constructor() {
10
+ this.open = false;
11
+ this.chatService = inject(ChatService);
12
+ this.socketService = inject(SocketService);
13
+ this.userId = input(null);
14
+ this.userName = input(null);
15
+ this.chatLauncher = inject(ChatLauncherComponent);
16
+ this.chatRoomDetails = new EventEmitter();
17
+ this.totalCount = computed(() => this.socketService.notifications().reduce((a, b) => a + b.unreadCount, 0));
18
+ }
19
+ ngOnInit() {
20
+ this.socketService.connect(this.userId());
21
+ this.chatService.getAllUserNotifications(this.userId()).subscribe(notifications => {
22
+ const data = notifications.map(n => {
23
+ return {
24
+ entityId: n.room_id,
25
+ eventType: n.type,
26
+ payload: { chatRoomId: n.room_id, chatRoomName: n.chat_room_name },
27
+ unreadCount: 0,
28
+ title: n.description
29
+ };
30
+ });
31
+ this.socketService.notifications.set(data);
32
+ this.socketService.notifyArrival();
33
+ });
34
+ }
35
+ toggle() {
36
+ this.open = !this.open;
37
+ }
38
+ openRoom(n) {
39
+ this.chatLauncher.isVisible.set(true);
40
+ this.chatService.markAsRead(n.entityId, n.eventType, this.userId()).subscribe(notification => {
41
+ console.log('markAsRead', notification);
42
+ setTimeout(() => {
43
+ this.chatService.getRoomDetails(n.payload.chatRoomId).subscribe(room => {
44
+ const users = room[0].Users
45
+ ? JSON.parse(room[0].Users).map((u) => ({
46
+ user_id: u.user_id,
47
+ full_name: u.full_name
48
+ }))
49
+ : [];
50
+ this.chatRoomDetails.emit({ roomId: room[0].Id, roomName: room[0].Name, metadata: room[0].Metadata, users });
51
+ this.socketService.clearRoom(n);
52
+ });
53
+ }, 800);
54
+ });
55
+ this.open = false;
56
+ }
57
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ChatWidgetNotificationComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
58
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: ChatWidgetNotificationComponent, isStandalone: true, selector: "chat-widget-notification", inputs: { userId: { classPropertyName: "userId", publicName: "userId", isSignal: true, isRequired: false, transformFunction: null }, userName: { classPropertyName: "userName", publicName: "userName", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { chatRoomDetails: "chatRoomDetails" }, providers: [ChatLauncherComponent], ngImport: i0, template: "<div (click)=\"toggle()\" class=\"notif-icon\">\r\n <i class=\"pi pi-bell\" [class.pulse]=\"socketService.hasNewNotification()\"></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 socketService.notifications(); track n.entityId + '_' + n.eventType) {\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?.payload?.chatRoomName }}</div>\r\n <div class=\"notif-text\">\r\n @if (n.eventType === 'NEW_MESSAGE') {\r\n New Message Received\r\n }\r\n\r\n @if (n.eventType === 'USER_ADDED') {\r\n You have been added to the chat\r\n }\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-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;display:flex;gap:5px;flex-direction:column}.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 }] }); }
59
+ }
60
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ChatWidgetNotificationComponent, decorators: [{
61
+ type: Component,
62
+ args: [{ selector: 'chat-widget-notification', standalone: true, imports: [
63
+ CommonModule,
64
+ FormsModule
65
+ ], providers: [ChatLauncherComponent], template: "<div (click)=\"toggle()\" class=\"notif-icon\">\r\n <i class=\"pi pi-bell\" [class.pulse]=\"socketService.hasNewNotification()\"></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 socketService.notifications(); track n.entityId + '_' + n.eventType) {\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?.payload?.chatRoomName }}</div>\r\n <div class=\"notif-text\">\r\n @if (n.eventType === 'NEW_MESSAGE') {\r\n New Message Received\r\n }\r\n\r\n @if (n.eventType === 'USER_ADDED') {\r\n You have been added to the chat\r\n }\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-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;display:flex;gap:5px;flex-direction:column}.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"] }]
66
+ }], ctorParameters: () => [], propDecorators: { chatRoomDetails: [{
67
+ type: Output
68
+ }] } });
69
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhdC13aWRnZXQtbm90aWZpY2F0aW9uLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NoYXQtd2lkZ2V0L3NyYy9saWIvY2hhdC13aWRnZXQtbm90aWZpY2F0aW9uL2NoYXQtd2lkZ2V0LW5vdGlmaWNhdGlvbi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jaGF0LXdpZGdldC9zcmMvbGliL2NoYXQtd2lkZ2V0LW5vdGlmaWNhdGlvbi9jaGF0LXdpZGdldC1ub3RpZmljYXRpb24uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFNBQVMsRUFBRSxRQUFRLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ3ZGLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSwrQkFBK0IsQ0FBQztBQUMxRCxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDN0MsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBRTNDLE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSxpQ0FBaUMsQ0FBQztBQUM5RCxPQUFPLEVBQUMscUJBQXFCLEVBQUMsTUFBTSwwQ0FBMEMsQ0FBQzs7QUFhL0UsTUFBTSxPQUFPLCtCQUErQjtJQWN4QztRQWJBLFNBQUksR0FBRyxLQUFLLENBQUM7UUFFYixnQkFBVyxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNsQyxrQkFBYSxHQUFHLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUN0QyxXQUFNLEdBQUcsS0FBSyxDQUFNLElBQUksQ0FBQyxDQUFDO1FBQzFCLGFBQVEsR0FBRyxLQUFLLENBQU0sSUFBSSxDQUFDLENBQUM7UUFDNUIsaUJBQVksR0FBRyxNQUFNLENBQUMscUJBQXFCLENBQUMsQ0FB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QUM7Z0JBQ3BDLENBQUMsQ0FBQyxDQUFBO1lBQ04sQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFBO1FBQ1gsQ0FBQyxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQztJQUN0QixDQUFDOytHQXZEUSwrQkFBK0I7bUdBQS9CLCtCQUErQixnWUFGN0IsQ0FBQyxxQkFBcUIsQ0FBQywwQkNqQnRDLHE2Q0FxQ0EsdTBERHpCUSxZQUFZLDhCQUNaLFdBQVc7OzRGQU1OLCtCQUErQjtrQkFYM0MsU0FBUzsrQkFDSSwwQkFBMEIsY0FDeEIsSUFBSSxXQUNQO3dCQUNMLFlBQVk7d0JBQ1osV0FBVztxQkFDZCxhQUdVLENBQUMscUJBQXFCLENBQUM7d0RBVXhCLGVBQWU7c0JBQXhCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0NvbXBvbmVudCwgY29tcHV0ZWQsIEV2ZW50RW1pdHRlciwgaW5qZWN0LCBpbnB1dCwgT3V0cHV0fSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHtDaGF0U2VydmljZX0gZnJvbSBcIi4uL2NvcmUvc2VydmljZXMvY2hhdC5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7Q29tbW9uTW9kdWxlfSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uXCI7XHJcbmltcG9ydCB7Rm9ybXNNb2R1bGV9IGZyb20gXCJAYW5ndWxhci9mb3Jtc1wiO1xyXG5pbXBvcnQge0NoYXROb3RpZmljYXRpb259IGZyb20gXCIuLi9jb3JlL21vZGVscy9ub3RpZmljYXRpb24ubW9kZWxcIjtcclxuaW1wb3J0IHtTb2NrZXRTZXJ2aWNlfSBmcm9tIFwiLi4vY29yZS9zZXJ2aWNlcy9zb2NrZXQuc2VydmljZVwiO1xyXG5pbXBvcnQge0NoYXRMYXVuY2hlckNvbXBvbmVudH0gZnJvbSBcIi4uL2NoYXQtbGF1bmNoZXIvY2hhdC1sYXVuY2hlci5jb21wb25lbnRcIjtcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gICAgc2VsZWN0b3I6ICdjaGF0LXdpZGdldC1ub3RpZmljYXRpb24nLFxyXG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcclxuICAgIGltcG9ydHM6IFtcclxuICAgICAgICBDb21tb25Nb2R1bGUsXHJcbiAgICAgICAgRm9ybXNNb2R1bGVcclxuICAgIF0sXHJcbiAgICB0ZW1wbGF0ZVVybDogJy4vY2hhdC13aWRnZXQtbm90aWZpY2F0aW9uLmNvbXBvbmVudC5odG1sJyxcclxuICAgIHN0eWxlVXJsOiAnLi9jaGF0LXdpZGdldC1ub3RpZmljYXRpb24uY29tcG9uZW50LmNzcycsXHJcbiAgICBwcm92aWRlcnM6IFtDaGF0TGF1bmNoZXJDb21wb25lbnRdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBDaGF0V2lkZ2V0Tm90aWZpY2F0aW9uQ29tcG9uZW50IHtcclxuICAgIG9wZW4gPSBmYWxzZTtcclxuXHJcbiAgICBjaGF0U2VydmljZSA9IGluamVjdChDaGF0U2VydmljZSk7XHJcbiAgICBzb2NrZXRTZXJ2aWNlID0gaW5qZWN0KFNvY2tldFNlcnZpY2UpO1xyXG4gICAgdXNlcklkID0gaW5wdXQ8YW55PihudWxsKTtcclxuICAgIHVzZXJOYW1lID0gaW5wdXQ8YW55PihudWxsKTtcclxuICAgIGNoYXRMYXVuY2hlciA9IGluamVjdChDaGF0TGF1bmNoZXJDb21wb25lbnQpO1xyXG4gICAgQE91dHB1dCgpIGNoYXRSb29tRGV0YWlscyA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuXHJcbiAgICB0b3RhbENvdW50ID0gY29tcHV0ZWQoKCkgPT5cclxuICAgICAgICB0aGlzLnNvY2tldFNlcnZpY2Uubm90aWZpY2F0aW9ucygpLnJlZHVjZSgoYTogYW55LCBiOiB7IHVucmVhZENvdW50OiBhbnk7IH0pID0+IGEgKyBiLnVucmVhZENvdW50LCAwKVxyXG4gICAgKTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcigpIHt9XHJcblxyXG4gICAgbmdPbkluaXQoKSB7XHJcbiAgICAgICAgdGhpcy5zb2NrZXRTZXJ2aWNlLmNvbm5lY3QodGhpcy51c2VySWQoKSk7XHJcbiAgICAgICAgdGhpcy5jaGF0U2VydmljZS5nZXRBbGxVc2VyTm90aWZpY2F0aW9ucyh0aGlzLnVzZXJJZCgpKS5zdWJzY3JpYmUobm90aWZpY2F0aW9ucyA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBub3RpZmljYXRpb25zLm1hcChuID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICAgICAgZW50aXR5SWQ6IG4ucm9vbV9pZCxcclxuICAgICAgICAgICAgICAgICAgICBldmVudFR5cGU6IG4udHlwZSxcclxuICAgICAgICAgICAgICAgICAgICBwYXlsb2FkOiB7Y2hhdFJvb21JZDogbi5yb29tX2lkLCBjaGF0Um9vbU5hbWU6IG4uY2hhdF9yb29tX25hbWV9LFxyXG4gICAgICAgICAgICAgICAgICAgIHVucmVhZENvdW50OiAwLFxyXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiBuLmRlc2NyaXB0aW9uXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB0aGlzLnNvY2tldFNlcnZpY2Uubm90aWZpY2F0aW9ucy5zZXQoZGF0YSk7XHJcbiAgICAgICAgICAgIHRoaXMuc29ja2V0U2VydmljZS5ub3RpZnlBcnJpdmFsKCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgdG9nZ2xlKCkge1xyXG4gICAgICAgIHRoaXMub3BlbiA9ICF0aGlzLm9wZW47XHJcbiAgICB9XHJcblxyXG4gICAgb3BlblJvb20objogQ2hhdE5vdGlmaWNhdGlvbikge1xyXG4gICAgICAgIHRoaXMuY2hhdExhdW5jaGVyLmlzVmlzaWJsZS5zZXQodHJ1ZSk7XHJcbiAgICAgICAgdGhpcy5jaGF0U2VydmljZS5tYXJrQXNSZWFkKG4uZW50aXR5SWQsIG4uZXZlbnRUeXBlLCB0aGlzLnVzZXJJZCgpKS5zdWJzY3JpYmUobm90aWZpY2F0aW9uID0+IHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coJ21hcmtBc1JlYWQnLCBub3RpZmljYXRpb24pO1xyXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2hhdFNlcnZpY2UuZ2V0Um9vbURldGFpbHMobi5wYXlsb2FkLmNoYXRSb29tSWQpLnN1YnNjcmliZShyb29tID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCB1c2VycyA9IHJvb21bMF0uVXNlcnNcclxuICAgICAgICAgICAgICAgICAgICAgICAgPyBKU09OLnBhcnNlKHJvb21bMF0uVXNlcnMpLm1hcCgodTogYW55KSA9PiAoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlcl9pZDogdS51c2VyX2lkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVsbF9uYW1lOiB1LmZ1bGxfbmFtZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgOiBbXTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNoYXRSb29tRGV0YWlscy5lbWl0KHtyb29tSWQ6IHJvb21bMF0uSWQsIHJvb21OYW1lOiByb29tWzBdLk5hbWUsIG1ldGFkYXRhOiByb29tWzBdLk1ldGFkYXRhLCB1c2Vyc30pO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc29ja2V0U2VydmljZS5jbGVhclJvb20obik7XHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB9LCA4MDApXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5vcGVuID0gZmFsc2U7XHJcbiAgICB9XHJcbn1cclxuIiwiPGRpdiAoY2xpY2spPVwidG9nZ2xlKClcIiBjbGFzcz1cIm5vdGlmLWljb25cIj5cclxuICAgIDxpIGNsYXNzPVwicGkgcGktYmVsbFwiIFtjbGFzcy5wdWxzZV09XCJzb2NrZXRTZXJ2aWNlLmhhc05ld05vdGlmaWNhdGlvbigpXCI+PC9pPlxyXG5cclxuICAgIEBpZiAodG90YWxDb3VudCgpID4gMCkge1xyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwiZG90XCI+PC9zcGFuPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwiYmFkZ2VcIj57eyB0b3RhbENvdW50KCkgfX08L3NwYW4+XHJcbiAgICB9XHJcbjwvZGl2PlxyXG5cclxuQGlmIChvcGVuKSB7XHJcbiAgICA8ZGl2IGNsYXNzPVwibm90aWYtcGFuZWxcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibm90aWYtbGlzdFwiPlxyXG4gICAgICAgICAgICBAZm9yIChuIG9mIHNvY2tldFNlcnZpY2Uubm90aWZpY2F0aW9ucygpOyB0cmFjayBuLmVudGl0eUlkICsgJ18nICsgbi5ldmVudFR5cGUpIHtcclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJub3RpZi1pdGVtXCIgKGNsaWNrKT1cIm9wZW5Sb29tKG4pXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm5vdGlmLWxlZnRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJwaSBwaS1jb21tZW50c1wiPjwvaT5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm5vdGlmLWJvZHlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm5vdGlmLXRpdGxlXCI+e3sgbj8ucGF5bG9hZD8uY2hhdFJvb21OYW1lIH19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJub3RpZi10ZXh0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYgKG4uZXZlbnRUeXBlID09PSAnTkVXX01FU1NBR0UnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmV3IE1lc3NhZ2UgUmVjZWl2ZWRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYgKG4uZXZlbnRUeXBlID09PSAnVVNFUl9BRERFRCcpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBZb3UgaGF2ZSBiZWVuIGFkZGVkIHRvIHRoZSBjaGF0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuPCEtLSAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjb3VudFwiPnt7IG4uY291bnQgfX08L3NwYW4+LS0+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbn1cclxuIl19
@@ -0,0 +1,47 @@
1
+ import { NgModule } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+ import { ChatLauncherComponent } from './chat-launcher/chat-launcher.component';
4
+ import { ChatWindowComponent } from './chat-window/chat-window.component';
5
+ import { AllChatsComponent } from './all-chats/all-chats.component';
6
+ import { CHAT_CONFIG } from './core/config/chat.tokens';
7
+ import { ChatWidgetNotificationComponent } from "./chat-widget-notification/chat-widget-notification.component";
8
+ import * as i0 from "@angular/core";
9
+ export class ChatWidgetModule {
10
+ static forRoot(config) {
11
+ return {
12
+ ngModule: ChatWidgetModule,
13
+ providers: [
14
+ {
15
+ provide: CHAT_CONFIG,
16
+ useValue: config
17
+ }
18
+ ]
19
+ };
20
+ }
21
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ChatWidgetModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
22
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "17.3.12", ngImport: i0, type: ChatWidgetModule, imports: [CommonModule,
23
+ ChatLauncherComponent,
24
+ ChatWindowComponent,
25
+ AllChatsComponent,
26
+ ChatWidgetNotificationComponent], exports: [ChatLauncherComponent] }); }
27
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ChatWidgetModule, imports: [CommonModule,
28
+ ChatLauncherComponent,
29
+ ChatWindowComponent,
30
+ AllChatsComponent,
31
+ ChatWidgetNotificationComponent] }); }
32
+ }
33
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ChatWidgetModule, decorators: [{
34
+ type: NgModule,
35
+ args: [{
36
+ declarations: [],
37
+ imports: [
38
+ CommonModule,
39
+ ChatLauncherComponent,
40
+ ChatWindowComponent,
41
+ AllChatsComponent,
42
+ ChatWidgetNotificationComponent
43
+ ],
44
+ exports: [ChatLauncherComponent]
45
+ }]
46
+ }] });
47
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhdC13aWRnZXQubW9kdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvY2hhdC13aWRnZXQvc3JjL2xpYi9jaGF0LXdpZGdldC5tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFzQixRQUFRLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDNUQsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQzdDLE9BQU8sRUFBQyxxQkFBcUIsRUFBQyxNQUFNLHlDQUF5QyxDQUFDO0FBQzlFLE9BQU8sRUFBQyxtQkFBbUIsRUFBQyxNQUFNLHFDQUFxQyxDQUFDO0FBQ3hFLE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLGlDQUFpQyxDQUFDO0FBQ2xFLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSwyQkFBMkIsQ0FBQztBQUV0RCxPQUFPLEVBQUMsK0JBQStCLEVBQUMsTUFBTSwrREFBK0QsQ0FBQzs7QUFhOUcsTUFBTSxPQUFPLGdCQUFnQjtJQUN6QixNQUFNLENBQUMsT0FBTyxDQUFDLE1BQWtCO1FBQzdCLE9BQU87WUFDSCxRQUFRLEVBQUUsZ0JBQWdCO1lBQzFCLFNBQVMsRUFBRTtnQkFDUDtvQkFDSSxPQUFPLEVBQUUsV0FBVztvQkFDcEIsUUFBUSxFQUFFLE1BQU07aUJBQ25CO2FBQ0o7U0FDSixDQUFDO0lBQ04sQ0FBQzsrR0FYUSxnQkFBZ0I7Z0hBQWhCLGdCQUFnQixZQVJyQixZQUFZO1lBQ1oscUJBQXFCO1lBQ3JCLG1CQUFtQjtZQUNuQixpQkFBaUI7WUFDakIsK0JBQStCLGFBRXpCLHFCQUFxQjtnSEFFdEIsZ0JBQWdCLFlBUnJCLFlBQVk7WUFDWixxQkFBcUI7WUFDckIsbUJBQW1CO1lBQ25CLGlCQUFpQjtZQUNqQiwrQkFBK0I7OzRGQUkxQixnQkFBZ0I7a0JBWDVCLFFBQVE7bUJBQUM7b0JBQ04sWUFBWSxFQUFFLEVBQUU7b0JBQ2hCLE9BQU8sRUFBRTt3QkFDTCxZQUFZO3dCQUNaLHFCQUFxQjt3QkFDckIsbUJBQW1CO3dCQUNuQixpQkFBaUI7d0JBQ2pCLCtCQUErQjtxQkFDbEM7b0JBQ0QsT0FBTyxFQUFFLENBQUMscUJBQXFCLENBQUM7aUJBQ25DIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtNb2R1bGVXaXRoUHJvdmlkZXJzLCBOZ01vZHVsZX0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7Q29tbW9uTW9kdWxlfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQge0NoYXRMYXVuY2hlckNvbXBvbmVudH0gZnJvbSAnLi9jaGF0LWxhdW5jaGVyL2NoYXQtbGF1bmNoZXIuY29tcG9uZW50JztcclxuaW1wb3J0IHtDaGF0V2luZG93Q29tcG9uZW50fSBmcm9tICcuL2NoYXQtd2luZG93L2NoYXQtd2luZG93LmNvbXBvbmVudCc7XHJcbmltcG9ydCB7QWxsQ2hhdHNDb21wb25lbnR9IGZyb20gJy4vYWxsLWNoYXRzL2FsbC1jaGF0cy5jb21wb25lbnQnO1xyXG5pbXBvcnQge0NIQVRfQ09ORklHfSBmcm9tICcuL2NvcmUvY29uZmlnL2NoYXQudG9rZW5zJztcclxuaW1wb3J0IHR5cGUge0NoYXRDb25maWd9IGZyb20gJy4vY29yZS9jb25maWcvY2hhdC1jb25maWcnO1xyXG5pbXBvcnQge0NoYXRXaWRnZXROb3RpZmljYXRpb25Db21wb25lbnR9IGZyb20gXCIuL2NoYXQtd2lkZ2V0LW5vdGlmaWNhdGlvbi9jaGF0LXdpZGdldC1ub3RpZmljYXRpb24uY29tcG9uZW50XCI7XHJcblxyXG5ATmdNb2R1bGUoe1xyXG4gICAgZGVjbGFyYXRpb25zOiBbXSxcclxuICAgIGltcG9ydHM6IFtcclxuICAgICAgICBDb21tb25Nb2R1bGUsXHJcbiAgICAgICAgQ2hhdExhdW5jaGVyQ29tcG9uZW50LFxyXG4gICAgICAgIENoYXRXaW5kb3dDb21wb25lbnQsXHJcbiAgICAgICAgQWxsQ2hhdHNDb21wb25lbnQsXHJcbiAgICAgICAgQ2hhdFdpZGdldE5vdGlmaWNhdGlvbkNvbXBvbmVudFxyXG4gICAgXSxcclxuICAgIGV4cG9ydHM6IFtDaGF0TGF1bmNoZXJDb21wb25lbnRdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBDaGF0V2lkZ2V0TW9kdWxlIHtcclxuICAgIHN0YXRpYyBmb3JSb290KGNvbmZpZzogQ2hhdENvbmZpZyk6IE1vZHVsZVdpdGhQcm92aWRlcnM8Q2hhdFdpZGdldE1vZHVsZT4ge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIG5nTW9kdWxlOiBDaGF0V2lkZ2V0TW9kdWxlLFxyXG4gICAgICAgICAgICBwcm92aWRlcnM6IFtcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBwcm92aWRlOiBDSEFUX0NPTkZJRyxcclxuICAgICAgICAgICAgICAgICAgICB1c2VWYWx1ZTogY29uZmlnXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIF1cclxuICAgICAgICB9O1xyXG4gICAgfVxyXG59XHJcbiJdfQ==
@@ -0,0 +1,12 @@
1
+ import { Injectable } from "@angular/core";
2
+ import * as i0 from "@angular/core";
3
+ export class ChatWidgetService {
4
+ constructor() { }
5
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ChatWidgetService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
6
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ChatWidgetService, providedIn: 'root' }); }
7
+ }
8
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ChatWidgetService, decorators: [{
9
+ type: Injectable,
10
+ args: [{ providedIn: 'root' }]
11
+ }], ctorParameters: () => [] });
12
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhdC13aWRnZXQuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2NoYXQtd2lkZ2V0L3NyYy9saWIvY2hhdC13aWRnZXQuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQVMsVUFBVSxFQUFDLE1BQU0sZUFBZSxDQUFDOztBQU1qRCxNQUFNLE9BQU8saUJBQWlCO0lBRTFCLGdCQUFlLENBQUM7K0dBRlAsaUJBQWlCO21IQUFqQixpQkFBaUIsY0FESixNQUFNOzs0RkFDbkIsaUJBQWlCO2tCQUQ3QixVQUFVO21CQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7aW5qZWN0LCBJbmplY3RhYmxlfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQge0NoYXRTZXJ2aWNlfSBmcm9tIFwiLi9jb3JlL3NlcnZpY2VzL2NoYXQuc2VydmljZVwiO1xyXG5pbXBvcnQge1NvY2tldFNlcnZpY2V9IGZyb20gXCIuL2NvcmUvc2VydmljZXMvc29ja2V0LnNlcnZpY2VcIjtcclxuaW1wb3J0IHtDaGF0TWVzc2FnZX0gZnJvbSBcIi4vY29yZS9tb2RlbHMvY2hhdC5tb2RlbHNcIjtcclxuXHJcbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogJ3Jvb3QnIH0pXHJcbmV4cG9ydCBjbGFzcyBDaGF0V2lkZ2V0U2VydmljZSB7XHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7fVxyXG59XHJcbiJdfQ==