@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.
- package/README.md +24 -0
- package/esm2022/arthakosh-chat.mjs +5 -0
- package/esm2022/lib/all-chats/all-chats.component.mjs +121 -0
- package/esm2022/lib/chat-launcher/chat-launcher.component.mjs +96 -0
- package/esm2022/lib/chat-widget-notification/chat-widget-notification.component.mjs +69 -0
- package/esm2022/lib/chat-widget.module.mjs +47 -0
- package/esm2022/lib/chat-widget.service.mjs +12 -0
- package/esm2022/lib/chat-window/chat-window.component.mjs +210 -0
- package/esm2022/lib/core/config/chat-config.mjs +2 -0
- package/esm2022/lib/core/config/chat.tokens.mjs +4 -0
- package/esm2022/lib/core/models/chat.models.mjs +2 -0
- package/esm2022/lib/core/models/notification.model.mjs +2 -0
- package/esm2022/lib/core/services/chat.service.mjs +117 -0
- package/esm2022/lib/core/services/socket.service.mjs +148 -0
- package/esm2022/public-api.mjs +10 -0
- package/fesm2022/arthakosh-chat.mjs +776 -0
- package/fesm2022/arthakosh-chat.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/lib/all-chats/all-chats.component.d.ts +23 -0
- package/lib/chat-launcher/chat-launcher.component.d.ts +34 -0
- package/lib/chat-widget-notification/chat-widget-notification.component.d.ts +22 -0
- package/lib/chat-widget.module.d.ts +14 -0
- package/lib/chat-widget.service.d.ts +6 -0
- package/lib/chat-window/chat-window.component.d.ts +49 -0
- package/lib/core/config/chat-config.d.ts +4 -0
- package/lib/core/config/chat.tokens.d.ts +3 -0
- package/lib/core/models/chat.models.d.ts +22 -0
- package/lib/core/models/notification.model.d.ts +6 -0
- package/lib/core/services/chat.service.d.ts +34 -0
- package/lib/core/services/socket.service.d.ts +38 -0
- package/package.json +42 -0
- 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==
|