@arthakosh/chat-widget 0.2.21 → 0.2.23
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/lib/chat-widget.module.mjs +13 -1
- package/esm2022/lib/chat-window/chat-window.component.mjs +6 -5
- package/esm2022/lib/core/config/chat-config.mjs +2 -0
- package/esm2022/lib/core/config/chat.tokens.mjs +4 -0
- package/esm2022/lib/core/services/chat.service.mjs +14 -6
- package/esm2022/lib/core/services/socket.service.mjs +12 -6
- package/fesm2022/arthakosh-chat-widget.mjs +40 -13
- package/fesm2022/arthakosh-chat-widget.mjs.map +1 -1
- package/lib/chat-widget.module.d.ts +3 -0
- package/lib/core/config/chat-config.d.ts +4 -0
- package/lib/core/config/chat.tokens.d.ts +3 -0
- package/lib/core/services/chat.service.d.ts +4 -2
- package/lib/core/services/socket.service.d.ts +3 -1
- package/package.json +1 -1
|
@@ -3,8 +3,20 @@ import { CommonModule } from '@angular/common';
|
|
|
3
3
|
import { ChatLauncherComponent } from './chat-launcher/chat-launcher.component';
|
|
4
4
|
import { ChatWindowComponent } from './chat-window/chat-window.component';
|
|
5
5
|
import { AllChatsComponent } from './all-chats/all-chats.component';
|
|
6
|
+
import { CHAT_CONFIG } from './core/config/chat.tokens';
|
|
6
7
|
import * as i0 from "@angular/core";
|
|
7
8
|
export class ChatWidgetModule {
|
|
9
|
+
static forRoot(config) {
|
|
10
|
+
return {
|
|
11
|
+
ngModule: ChatWidgetModule,
|
|
12
|
+
providers: [
|
|
13
|
+
{
|
|
14
|
+
provide: CHAT_CONFIG,
|
|
15
|
+
useValue: config
|
|
16
|
+
}
|
|
17
|
+
]
|
|
18
|
+
};
|
|
19
|
+
}
|
|
8
20
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ChatWidgetModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
|
|
9
21
|
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "17.3.12", ngImport: i0, type: ChatWidgetModule, imports: [CommonModule,
|
|
10
22
|
ChatLauncherComponent,
|
|
@@ -28,4 +40,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
28
40
|
exports: [ChatLauncherComponent]
|
|
29
41
|
}]
|
|
30
42
|
}] });
|
|
31
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
43
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhdC13aWRnZXQubW9kdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvY2hhdC13aWRnZXQvc3JjL2xpYi9jaGF0LXdpZGdldC5tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUF1QixRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDOUQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQ2hGLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQzFFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ3BFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQzs7QUFjeEQsTUFBTSxPQUFPLGdCQUFnQjtJQUMzQixNQUFNLENBQUMsT0FBTyxDQUFDLE1BQWtCO1FBQy9CLE9BQU87WUFDTCxRQUFRLEVBQUUsZ0JBQWdCO1lBQzFCLFNBQVMsRUFBRTtnQkFDVDtvQkFDRSxPQUFPLEVBQUUsV0FBVztvQkFDcEIsUUFBUSxFQUFFLE1BQU07aUJBQ2pCO2FBQ0Y7U0FDRixDQUFDO0lBQ0osQ0FBQzsrR0FYVSxnQkFBZ0I7Z0hBQWhCLGdCQUFnQixZQVB6QixZQUFZO1lBQ1oscUJBQXFCO1lBQ3JCLG1CQUFtQjtZQUNuQixpQkFBaUIsYUFFVCxxQkFBcUI7Z0hBRXBCLGdCQUFnQixZQVB6QixZQUFZO1lBQ1oscUJBQXFCO1lBQ3JCLG1CQUFtQjtZQUNuQixpQkFBaUI7OzRGQUlSLGdCQUFnQjtrQkFYNUIsUUFBUTttQkFBQztvQkFDUixZQUFZLEVBQUUsRUFDYjtvQkFDRCxPQUFPLEVBQUU7d0JBQ1AsWUFBWTt3QkFDWixxQkFBcUI7d0JBQ3JCLG1CQUFtQjt3QkFDbkIsaUJBQWlCO3FCQUNsQjtvQkFDRCxPQUFPLEVBQUUsQ0FBQyxxQkFBcUIsQ0FBQztpQkFDakMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBNb2R1bGVXaXRoUHJvdmlkZXJzLCBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQgeyBDaGF0TGF1bmNoZXJDb21wb25lbnQgfSBmcm9tICcuL2NoYXQtbGF1bmNoZXIvY2hhdC1sYXVuY2hlci5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBDaGF0V2luZG93Q29tcG9uZW50IH0gZnJvbSAnLi9jaGF0LXdpbmRvdy9jaGF0LXdpbmRvdy5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBBbGxDaGF0c0NvbXBvbmVudCB9IGZyb20gJy4vYWxsLWNoYXRzL2FsbC1jaGF0cy5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBDSEFUX0NPTkZJRyB9IGZyb20gJy4vY29yZS9jb25maWcvY2hhdC50b2tlbnMnO1xyXG5pbXBvcnQgdHlwZSB7IENoYXRDb25maWcgfSBmcm9tICcuL2NvcmUvY29uZmlnL2NoYXQtY29uZmlnJztcclxuXHJcbkBOZ01vZHVsZSh7XHJcbiAgZGVjbGFyYXRpb25zOiBbXHJcbiAgXSxcclxuICBpbXBvcnRzOiBbXHJcbiAgICBDb21tb25Nb2R1bGUsXHJcbiAgICBDaGF0TGF1bmNoZXJDb21wb25lbnQsXHJcbiAgICBDaGF0V2luZG93Q29tcG9uZW50LFxyXG4gICAgQWxsQ2hhdHNDb21wb25lbnRcclxuICBdLFxyXG4gIGV4cG9ydHM6IFtDaGF0TGF1bmNoZXJDb21wb25lbnRdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBDaGF0V2lkZ2V0TW9kdWxlIHtcclxuICBzdGF0aWMgZm9yUm9vdChjb25maWc6IENoYXRDb25maWcpOiBNb2R1bGVXaXRoUHJvdmlkZXJzPENoYXRXaWRnZXRNb2R1bGU+IHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIG5nTW9kdWxlOiBDaGF0V2lkZ2V0TW9kdWxlLFxyXG4gICAgICBwcm92aWRlcnM6IFtcclxuICAgICAgICB7XHJcbiAgICAgICAgICBwcm92aWRlOiBDSEFUX0NPTkZJRyxcclxuICAgICAgICAgIHVzZVZhbHVlOiBjb25maWdcclxuICAgICAgICB9XHJcbiAgICAgIF1cclxuICAgIH07XHJcbiAgfVxyXG59XHJcbiJdfQ==
|
|
@@ -18,8 +18,9 @@ import * as i2 from "@angular/forms";
|
|
|
18
18
|
import * as i3 from "primeng/toast";
|
|
19
19
|
import * as i4 from "primeng/button";
|
|
20
20
|
import * as i5 from "primeng/avatar";
|
|
21
|
-
import * as i6 from "primeng/
|
|
22
|
-
import * as i7 from "primeng/
|
|
21
|
+
import * as i6 from "primeng/tooltip";
|
|
22
|
+
import * as i7 from "primeng/inputtextarea";
|
|
23
|
+
import * as i8 from "primeng/dropdown";
|
|
23
24
|
export class ChatWindowComponent {
|
|
24
25
|
constructor() {
|
|
25
26
|
this.header = 'Chat';
|
|
@@ -171,7 +172,7 @@ export class ChatWindowComponent {
|
|
|
171
172
|
this.showUsers = !this.showUsers;
|
|
172
173
|
}
|
|
173
174
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ChatWindowComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
174
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: ChatWindowComponent, isStandalone: true, selector: "app-chat-window", inputs: { chatRoomId: { classPropertyName: "chatRoomId", publicName: "chatRoomId", isSignal: false, isRequired: false, transformFunction: null }, header: { classPropertyName: "header", publicName: "header", isSignal: false, isRequired: false, transformFunction: null }, metadata: { classPropertyName: "metadata", publicName: "metadata", isSignal: false, isRequired: false, transformFunction: null }, chatUsers: { classPropertyName: "chatUsers", publicName: "chatUsers", isSignal: false, isRequired: false, transformFunction: null }, addUserAllowed: { classPropertyName: "addUserAllowed", publicName: "addUserAllowed", isSignal: false, isRequired: false, transformFunction: null }, mode: { classPropertyName: "mode", publicName: "mode", isSignal: false, isRequired: false, transformFunction: null }, theme: { classPropertyName: "theme", publicName: "theme", isSignal: false, isRequired: false, transformFunction: null }, refreshRoom: { classPropertyName: "refreshRoom", publicName: "refreshRoom", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { onArchive: "onArchive" }, providers: [MessageService], viewQueries: [{ propertyName: "messagesContainer", first: true, predicate: ["messagesContainer"], descendants: true }, { propertyName: "reactionOverlay", first: true, predicate: ["reactionOverlay"], descendants: true }], ngImport: i0, template: "<p-toast></p-toast>\r\n\r\n<div class=\"chat-window\" [class.minimized]=\"minimized\" [class.floating]=\"mode === 'floating'\"\r\n [class.fullscreen]=\"mode === 'fullscreen'\" [class.dark]=\"theme === 'dark'\">\r\n <div class=\"chat-header\">\r\n <div style=\"display: flex; flex-direction: column;\">\r\n <div class=\"title\">\r\n <span>{{ header }}</span>\r\n <span *ngIf=\"users().length\">({{ users().length }} {{ users().length == 1 ? 'participant' :\r\n 'participants'}})</span>\r\n </div>\r\n <div>\r\n <span>{{ metadata }}</span>\r\n </div>\r\n </div>\r\n <div class=\"header-actions\">\r\n <button pButton icon=\"pi pi-users\" (click)=\"toggleUsers()\" style=\"font-size: 0.5rem\"></button>\r\n <button pButton icon=\"pi pi-minus\" (click)=\"toggleMinimize()\" style=\"font-size: 0.5rem\"></button>\r\n <button pButton icon=\"pi pi-trash\" (click)=\"archiveChat()\" style=\"font-size: 0.5rem\"></button>\r\n </div>\r\n </div>\r\n\r\n <div class=\"chat-body\" *ngIf=\"!minimized\">\r\n <div class=\"chat-layout\" [class.users-hidden]=\"!showUsers\">\r\n <div class=\"chat-main\" [class.fullscreen]=\"mode === 'fullscreen'\" [class.floating]=\"mode === 'floating'\">\r\n <div class=\"messages\" #messagesContainer [class.loading]=\"loading\">\r\n <div *ngFor=\"let msg of messages(); trackBy: trackById\" class=\"message-row\"\r\n [ngClass]=\"{ outgoing: msg.senderId === chatService.currentUser().userId, incoming: msg.senderId !== chatService.currentUser().userId }\">\r\n <div class=\"message-bubble\">\r\n <div class=\"message-meta\">\r\n <span class=\"sender\">\r\n <!-- *ngIf=\"msg.senderId !== chatService.currentUser().userId\" -->\r\n {{ msg.senderName }}\r\n </span>\r\n <!-- <span class=\"time\">\r\n {{ msg.createdAt | date: 'shortTime' }}\r\n </span> -->\r\n </div>\r\n\r\n <!-- MESSAGE TEXT -->\r\n <div class=\"message-content\">\r\n {{ msg.content }}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"input-area\">\r\n <div class=\"reply-banner\" *ngIf=\"replyTo\">\r\n <span>Replying to: {{ replyTo.content | slice: 0:50 }}</span>\r\n <button pButton icon=\"pi pi-times\" class=\"p-button-text p-button-sm\" (click)=\"clearReply()\"></button>\r\n </div>\r\n\r\n <textarea pInputTextarea [(ngModel)]=\"newMessage\" rows=\"2\" autoResize=\"true\" placeholder=\"Type a message\"\r\n (keyup.enter)=\"send()\">\r\n </textarea>\r\n\r\n <div class=\"input-actions\">\r\n <button pButton icon=\"pi pi-send\" label=\"Send\" (click)=\"send()\"></button>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"chat-sidebar\">\r\n <div class=\"section-title\">Users</div>\r\n <div class=\"user-list\">\r\n <div class=\"user-row\" *ngFor=\"let u of users()\">\r\n <p-avatar [label]=\"u.username[0]\"></p-avatar>\r\n <span>{{ u.username }}</span>\r\n </div>\r\n </div>\r\n @if(addUserAllowed) {\r\n <div class=\"user-list-add\">\r\n <p-dropdown [options]=\"chatService.userList()\" [(ngModel)]=\"selectedUser\" optionLabel=\"full_name\"\r\n placeholder=\"Select User\" />\r\n <div style=\"margin-top: 2em;\">\r\n <button pButton icon=\"pi pi-plus\" label=\"Add\" (click)=\"addUserToRoom()\"></button>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n</div>", styles: [".chat-window{width:35vw;max-width:95vw;display:flex;flex-direction:column;background:#fff;border-radius:16px;box-shadow:0 8px 30px #0000001f;overflow:visible;font-size:14px;font-family:Inter,system-ui,sans-serif}.chat-window.minimized{height:auto}.chat-header{display:flex;align-items:center;justify-content:space-between;background:#4f6ef7;color:#fff;padding:10px 14px}.chat-header .title{display:flex;flex-direction:row;gap:6px}.chat-header .title span{font-weight:600;font-size:14px}.chat-header .title small{font-size:11px;opacity:.85}.chat-body{display:flex;flex:1;background:#f5f7fb}.chat-layout{display:flex;flex:1;width:100%;overflow:hidden}.chat-layout.users-hidden .chat-sidebar{transform:translate(100%);opacity:0;pointer-events:none;width:0!important}.chat-layout.users-hidden .chat-main{flex:1 1 100%}.chat-main{flex:1;display:flex;flex-direction:column;background:#f5f7fb;height:70vh}.messages{flex:1;padding:16px 14px;overflow-y:auto;scroll-behavior:smooth}.message-row{display:flex;margin-bottom:14px;animation:messageIn .25s ease-out;position:relative;overflow:visible;padding-top:28px}@keyframes messageIn{0%{opacity:0;transform:translateY(6px)}to{opacity:1;transform:translateY(0)}}.message-row.incoming{justify-content:flex-start}.message-row.incoming .reaction-bar{left:12px}.message-row.outgoing{justify-content:flex-end}.message-row.outgoing .reaction-bar{right:12px;left:auto}.message-bubble{position:relative;max-width:72%;padding:10px 14px;border-radius:16px;font-size:14px;line-height:1.45;word-break:break-word;overflow:visible}.message-row.incoming .message-bubble{background:#fff;color:#111;border-top-left-radius:6px;box-shadow:0 3px 10px #0000000f;overflow:visible}.message-bubble:after{content:\"\";position:absolute;bottom:-6px;right:8px}.message-row.incoming .message-bubble:after{content:\"\";position:absolute;left:-6px;top:12px;width:0;height:0;border-top:6px solid transparent;border-bottom:6px solid transparent;border-right:6px solid #ffffff}.message-row.outgoing .message-bubble{background:#4f6ef7;color:#fff;border-top-right-radius:6px;overflow:visible}.message-row.outgoing .message-bubble:after{content:\"\";position:absolute;right:-6px;top:12px;width:0;height:0;border-top:6px solid transparent;border-bottom:6px solid transparent;border-left:6px solid #4f6ef7}.message-meta{display:flex;justify-content:flex-end;font-size:10px;opacity:.6;margin-bottom:4px}.typing-indicator{display:inline-flex;align-items:center;gap:4px;padding:8px 12px;background:#fff;border-radius:14px;box-shadow:0 2px 6px #00000014}.typing-indicator span{width:6px;height:6px;background:#999;border-radius:50%;animation:typingDots 1.4s infinite ease-in-out both}.typing-indicator span:nth-child(1){animation-delay:0s}.typing-indicator span:nth-child(2){animation-delay:.2s}.typing-indicator span:nth-child(3){animation-delay:.4s}@keyframes typingDots{0%{transform:translateY(0);opacity:.4}50%{transform:translateY(-4px);opacity:1}to{transform:translateY(0);opacity:.4}}.input-area{background:#fff;padding:10px;border:1px solid #e5e7eb;display:flex;flex-direction:row;justify-content:space-between;gap:5px}.input-area textarea{max-height:60px;overflow:hidden;width:-webkit-fill-available}.reply-banner{background:#eef2ff;border-left:3px solid #4f6ef7;padding:6px 8px;font-size:12px;border-radius:8px;margin-bottom:6px;display:flex;justify-content:space-between}.input-actions{display:flex;justify-content:flex-end;margin-top:6px}.input-actions button{background:#4f6ef7;color:#fff;border-radius:999px;padding:0 16px}.chat-sidebar{background:#fff;border-left:1px solid #e5e7eb;box-shadow:-4px 0 10px #0000000d;display:flex;flex-direction:column}.section-title{font-weight:600;font-size:13px;padding:10px;border-bottom:1px solid #e5e7eb}.user-list{flex:1;overflow-y:auto;padding:8px;max-height:20em}.user-row{display:flex;align-items:center;gap:8px;padding:6px 8px;border-radius:8px}.user-row:hover{background:#f1f5f9}.user-list-add{padding:10px;border-top:1px solid #e5e7eb}.header-actions{display:flex;align-items:center;gap:6px}.header-actions .p-button{width:32px;height:32px;padding:0;border-radius:50%;background:#ffffff26}.header-actions .p-button:hover{background:#ffffff40}.chat-header{min-height:48px}.header-actions{flex-shrink:0}.header-actions .p-button{transition:background .2s ease,transform .1s ease}.header-actions .p-button:active{transform:scale(.92)}.reaction-bar{position:absolute;top:0;left:12px;transform:translateY(-100%);background:#fff;border-radius:20px;padding:4px 8px;display:none;box-shadow:0 2px 8px #0003;z-index:9999}.message-bubble:hover .reaction-bar{display:flex}.reaction-bar span{cursor:pointer;font-size:16px}.reaction-summary{margin-top:4px;display:flex;gap:6px}.reaction-chip{background:#f1f1f1;padding:2px 6px;border-radius:12px;font-size:12px;position:relative}.reaction-users-tooltip{position:absolute;bottom:130%;left:50%;transform:translate(-50%);white-space:nowrap;background:#222;color:#fff;padding:4px 8px;border-radius:6px;z-index:10000;bottom:calc(100% + 6px)}.message-row,.message-bubble,.reaction-summary{overflow:visible!important}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i1.SlicePipe, name: "slice" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: ToastModule }, { kind: "component", type: i3.Toast, selector: "p-toast", inputs: ["key", "autoZIndex", "baseZIndex", "life", "style", "styleClass", "position", "preventOpenDuplicates", "preventDuplicates", "showTransformOptions", "hideTransformOptions", "showTransitionOptions", "hideTransitionOptions", "breakpoints"], outputs: ["onClose"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "directive", type: i4.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading", "severity", "raised", "rounded", "text", "outlined", "size", "plain"] }, { kind: "ngmodule", type: AvatarModule }, { kind: "component", type: i5.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: "directive", type: i6.InputTextarea, selector: "[pInputTextarea]", inputs: ["autoResize", "variant"], outputs: ["onResize"] }, { kind: "ngmodule", type: ChipModule }, { kind: "ngmodule", type: DropdownModule }, { kind: "component", type: i7.Dropdown, selector: "p-dropdown", inputs: ["id", "scrollHeight", "filter", "name", "style", "panelStyle", "styleClass", "panelStyleClass", "readonly", "required", "editable", "appendTo", "tabindex", "placeholder", "loadingIcon", "filterPlaceholder", "filterLocale", "variant", "inputId", "dataKey", "filterBy", "filterFields", "autofocus", "resetFilterOnHide", "checkmark", "dropdownIcon", "loading", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "autoDisplayFirst", "group", "showClear", "emptyFilterMessage", "emptyMessage", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "ariaLabel", "ariaLabelledBy", "filterMatchMode", "maxlength", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "focusOnHover", "selectOnFocus", "autoOptionFocus", "autofocusFilter", "autoShowPanelOnPrintableCharacterKeyDown", "disabled", "itemSize", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "filterValue", "options"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onShow", "onHide", "onClear", "onLazyLoad"] }, { kind: "ngmodule", type: OverlayPanelModule }] }); }
|
|
175
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: ChatWindowComponent, isStandalone: true, selector: "app-chat-window", inputs: { chatRoomId: { classPropertyName: "chatRoomId", publicName: "chatRoomId", isSignal: false, isRequired: false, transformFunction: null }, header: { classPropertyName: "header", publicName: "header", isSignal: false, isRequired: false, transformFunction: null }, metadata: { classPropertyName: "metadata", publicName: "metadata", isSignal: false, isRequired: false, transformFunction: null }, chatUsers: { classPropertyName: "chatUsers", publicName: "chatUsers", isSignal: false, isRequired: false, transformFunction: null }, addUserAllowed: { classPropertyName: "addUserAllowed", publicName: "addUserAllowed", isSignal: false, isRequired: false, transformFunction: null }, mode: { classPropertyName: "mode", publicName: "mode", isSignal: false, isRequired: false, transformFunction: null }, theme: { classPropertyName: "theme", publicName: "theme", isSignal: false, isRequired: false, transformFunction: null }, refreshRoom: { classPropertyName: "refreshRoom", publicName: "refreshRoom", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { onArchive: "onArchive" }, providers: [MessageService], viewQueries: [{ propertyName: "messagesContainer", first: true, predicate: ["messagesContainer"], descendants: true }, { propertyName: "reactionOverlay", first: true, predicate: ["reactionOverlay"], descendants: true }], ngImport: i0, template: "<p-toast></p-toast>\r\n\r\n<div class=\"chat-window\" [class.minimized]=\"minimized\" [class.floating]=\"mode === 'floating'\"\r\n [class.fullscreen]=\"mode === 'fullscreen'\" [class.dark]=\"theme === 'dark'\">\r\n <div class=\"chat-header\">\r\n <div style=\"display: flex; flex-direction: column;\">\r\n <div class=\"title\">\r\n <span>{{ header }}</span>\r\n <span *ngIf=\"users().length\">({{ users().length }} {{ users().length == 1 ? 'participant' :\r\n 'participants'}})</span>\r\n </div>\r\n <div>\r\n <span>{{ metadata }}</span>\r\n </div>\r\n </div>\r\n <div class=\"header-actions\">\r\n <button pButton icon=\"pi pi-users\" (click)=\"toggleUsers()\" style=\"font-size: 0.5rem\" pTooltip=\"Toogle Users\"></button>\r\n <button pButton [icon]=\"minimized ? 'pi pi-plus' : 'pi pi-minus'\" (click)=\"toggleMinimize()\" style=\"font-size: 0.5rem\" pTooltip=\"Hide/Show\"></button>\r\n <button pButton icon=\"pi pi-trash\" (click)=\"archiveChat()\" style=\"font-size: 0.5rem\" pTooltip=\"Archive\"></button>\r\n </div>\r\n </div>\r\n\r\n <div class=\"chat-body\" *ngIf=\"!minimized\">\r\n <div class=\"chat-layout\" [class.users-hidden]=\"!showUsers\">\r\n <div class=\"chat-main\" [class.fullscreen]=\"mode === 'fullscreen'\" [class.floating]=\"mode === 'floating'\">\r\n <div class=\"messages\" #messagesContainer [class.loading]=\"loading\">\r\n <div *ngFor=\"let msg of messages(); trackBy: trackById\" class=\"message-row\"\r\n [ngClass]=\"{ outgoing: msg.senderId === chatService.currentUser().userId, incoming: msg.senderId !== chatService.currentUser().userId }\">\r\n <div class=\"message-bubble\">\r\n <div class=\"message-meta\">\r\n <span class=\"sender\">\r\n <!-- *ngIf=\"msg.senderId !== chatService.currentUser().userId\" -->\r\n {{ msg.senderName }}\r\n </span>\r\n <!-- <span class=\"time\">\r\n {{ msg.createdAt | date: 'shortTime' }}\r\n </span> -->\r\n </div>\r\n\r\n <!-- MESSAGE TEXT -->\r\n <div class=\"message-content\">\r\n {{ msg.content }}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"input-area\">\r\n <div class=\"reply-banner\" *ngIf=\"replyTo\">\r\n <span>Replying to: {{ replyTo.content | slice: 0:50 }}</span>\r\n <button pButton icon=\"pi pi-times\" class=\"p-button-text p-button-sm\" (click)=\"clearReply()\"></button>\r\n </div>\r\n\r\n <textarea pInputTextarea [(ngModel)]=\"newMessage\" rows=\"2\" autoResize=\"true\" placeholder=\"Type a message\"\r\n (keyup.enter)=\"send()\">\r\n </textarea>\r\n\r\n <div class=\"input-actions\">\r\n <button pButton icon=\"pi pi-send\" label=\"Send\" (click)=\"send()\"></button>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"chat-sidebar\">\r\n <div class=\"section-title\">Users</div>\r\n <div class=\"user-list\">\r\n <div class=\"user-row\" *ngFor=\"let u of users()\">\r\n <p-avatar [label]=\"u.username[0]\"></p-avatar>\r\n <span>{{ u.username }}</span>\r\n </div>\r\n </div>\r\n @if(addUserAllowed) {\r\n <div class=\"user-list-add\">\r\n <p-dropdown [options]=\"chatService.userList()\" [(ngModel)]=\"selectedUser\" optionLabel=\"full_name\"\r\n placeholder=\"Select User\" />\r\n <div style=\"margin-top: 2em;\">\r\n <button pButton icon=\"pi pi-plus\" label=\"Add\" (click)=\"addUserToRoom()\"></button>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n</div>", styles: [".chat-window{width:35vw;max-width:95vw;display:flex;flex-direction:column;background:#fff;border-radius:16px;box-shadow:0 8px 30px #0000001f;overflow:visible;font-size:14px;font-family:Inter,system-ui,sans-serif}.chat-window.minimized{height:auto}.chat-header{display:flex;align-items:center;justify-content:space-between;background:#4f6ef7;color:#fff;padding:10px 14px}.chat-header .title{display:flex;flex-direction:row;gap:6px}.chat-header .title span{font-weight:600;font-size:14px}.chat-header .title small{font-size:11px;opacity:.85}.chat-body{display:flex;flex:1;background:#f5f7fb}.chat-layout{display:flex;flex:1;width:100%;overflow:hidden}.chat-layout.users-hidden .chat-sidebar{transform:translate(100%);opacity:0;pointer-events:none;width:0!important}.chat-layout.users-hidden .chat-main{flex:1 1 100%}.chat-main{flex:1;display:flex;flex-direction:column;background:#f5f7fb;height:70vh}.messages{flex:1;padding:16px 14px;overflow-y:auto;scroll-behavior:smooth}.message-row{display:flex;margin-bottom:14px;animation:messageIn .25s ease-out;position:relative;overflow:visible;padding-top:28px}@keyframes messageIn{0%{opacity:0;transform:translateY(6px)}to{opacity:1;transform:translateY(0)}}.message-row.incoming{justify-content:flex-start}.message-row.incoming .reaction-bar{left:12px}.message-row.outgoing{justify-content:flex-end}.message-row.outgoing .reaction-bar{right:12px;left:auto}.message-bubble{position:relative;max-width:72%;padding:10px 14px;border-radius:16px;font-size:14px;line-height:1.45;word-break:break-word;overflow:visible}.message-row.incoming .message-bubble{background:#fff;color:#111;border-top-left-radius:6px;box-shadow:0 3px 10px #0000000f;overflow:visible}.message-bubble:after{content:\"\";position:absolute;bottom:-6px;right:8px}.message-row.incoming .message-bubble:after{content:\"\";position:absolute;left:-6px;top:12px;width:0;height:0;border-top:6px solid transparent;border-bottom:6px solid transparent;border-right:6px solid #ffffff}.message-row.outgoing .message-bubble{background:#4f6ef7;color:#fff;border-top-right-radius:6px;overflow:visible}.message-row.outgoing .message-bubble:after{content:\"\";position:absolute;right:-6px;top:12px;width:0;height:0;border-top:6px solid transparent;border-bottom:6px solid transparent;border-left:6px solid #4f6ef7}.message-meta{display:flex;justify-content:flex-end;font-size:10px;opacity:.6;margin-bottom:4px}.typing-indicator{display:inline-flex;align-items:center;gap:4px;padding:8px 12px;background:#fff;border-radius:14px;box-shadow:0 2px 6px #00000014}.typing-indicator span{width:6px;height:6px;background:#999;border-radius:50%;animation:typingDots 1.4s infinite ease-in-out both}.typing-indicator span:nth-child(1){animation-delay:0s}.typing-indicator span:nth-child(2){animation-delay:.2s}.typing-indicator span:nth-child(3){animation-delay:.4s}@keyframes typingDots{0%{transform:translateY(0);opacity:.4}50%{transform:translateY(-4px);opacity:1}to{transform:translateY(0);opacity:.4}}.input-area{background:#fff;padding:10px;border:1px solid #e5e7eb;display:flex;flex-direction:row;justify-content:space-between;gap:5px}.input-area textarea{max-height:60px;overflow:hidden;width:-webkit-fill-available}.reply-banner{background:#eef2ff;border-left:3px solid #4f6ef7;padding:6px 8px;font-size:12px;border-radius:8px;margin-bottom:6px;display:flex;justify-content:space-between}.input-actions{display:flex;justify-content:flex-end;margin-top:6px}.input-actions button{background:#4f6ef7;color:#fff;border-radius:999px;padding:0 16px}.chat-sidebar{background:#fff;border-left:1px solid #e5e7eb;box-shadow:-4px 0 10px #0000000d;display:flex;flex-direction:column}.section-title{font-weight:600;font-size:13px;padding:10px;border-bottom:1px solid #e5e7eb}.user-list{flex:1;overflow-y:auto;padding:8px;max-height:20em}.user-row{display:flex;align-items:center;gap:8px;padding:6px 8px;border-radius:8px}.user-row:hover{background:#f1f5f9}.user-list-add{padding:10px;border-top:1px solid #e5e7eb}.header-actions{display:flex;align-items:center;gap:6px}.header-actions .p-button{width:32px;height:32px;padding:0;border-radius:50%;background:#ffffff26}.header-actions .p-button:hover{background:#ffffff40}.chat-header{min-height:48px}.header-actions{flex-shrink:0}.header-actions .p-button{transition:background .2s ease,transform .1s ease}.header-actions .p-button:active{transform:scale(.92)}.reaction-bar{position:absolute;top:0;left:12px;transform:translateY(-100%);background:#fff;border-radius:20px;padding:4px 8px;display:none;box-shadow:0 2px 8px #0003;z-index:9999}.message-bubble:hover .reaction-bar{display:flex}.reaction-bar span{cursor:pointer;font-size:16px}.reaction-summary{margin-top:4px;display:flex;gap:6px}.reaction-chip{background:#f1f1f1;padding:2px 6px;border-radius:12px;font-size:12px;position:relative}.reaction-users-tooltip{position:absolute;bottom:130%;left:50%;transform:translate(-50%);white-space:nowrap;background:#222;color:#fff;padding:4px 8px;border-radius:6px;z-index:10000;bottom:calc(100% + 6px)}.message-row,.message-bubble,.reaction-summary{overflow:visible!important}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i1.SlicePipe, name: "slice" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: ToastModule }, { kind: "component", type: i3.Toast, selector: "p-toast", inputs: ["key", "autoZIndex", "baseZIndex", "life", "style", "styleClass", "position", "preventOpenDuplicates", "preventDuplicates", "showTransformOptions", "hideTransformOptions", "showTransitionOptions", "hideTransitionOptions", "breakpoints"], outputs: ["onClose"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "directive", type: i4.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading", "severity", "raised", "rounded", "text", "outlined", "size", "plain"] }, { kind: "ngmodule", type: AvatarModule }, { kind: "component", type: i5.Avatar, selector: "p-avatar", inputs: ["label", "icon", "image", "size", "shape", "style", "styleClass", "ariaLabel", "ariaLabelledBy"], outputs: ["onImageError"] }, { kind: "ngmodule", type: TooltipModule }, { kind: "directive", type: i6.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "pTooltip", "tooltipDisabled", "tooltipOptions"] }, { kind: "ngmodule", type: InputTextareaModule }, { kind: "directive", type: i7.InputTextarea, selector: "[pInputTextarea]", inputs: ["autoResize", "variant"], outputs: ["onResize"] }, { kind: "ngmodule", type: ChipModule }, { kind: "ngmodule", type: DropdownModule }, { kind: "component", type: i8.Dropdown, selector: "p-dropdown", inputs: ["id", "scrollHeight", "filter", "name", "style", "panelStyle", "styleClass", "panelStyleClass", "readonly", "required", "editable", "appendTo", "tabindex", "placeholder", "loadingIcon", "filterPlaceholder", "filterLocale", "variant", "inputId", "dataKey", "filterBy", "filterFields", "autofocus", "resetFilterOnHide", "checkmark", "dropdownIcon", "loading", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "autoDisplayFirst", "group", "showClear", "emptyFilterMessage", "emptyMessage", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "ariaLabel", "ariaLabelledBy", "filterMatchMode", "maxlength", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "focusOnHover", "selectOnFocus", "autoOptionFocus", "autofocusFilter", "autoShowPanelOnPrintableCharacterKeyDown", "disabled", "itemSize", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "filterValue", "options"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onShow", "onHide", "onClear", "onLazyLoad"] }, { kind: "ngmodule", type: OverlayPanelModule }] }); }
|
|
175
176
|
}
|
|
176
177
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ChatWindowComponent, decorators: [{
|
|
177
178
|
type: Component,
|
|
@@ -186,7 +187,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
186
187
|
ChipModule,
|
|
187
188
|
DropdownModule,
|
|
188
189
|
OverlayPanelModule
|
|
189
|
-
], providers: [MessageService], template: "<p-toast></p-toast>\r\n\r\n<div class=\"chat-window\" [class.minimized]=\"minimized\" [class.floating]=\"mode === 'floating'\"\r\n [class.fullscreen]=\"mode === 'fullscreen'\" [class.dark]=\"theme === 'dark'\">\r\n <div class=\"chat-header\">\r\n <div style=\"display: flex; flex-direction: column;\">\r\n <div class=\"title\">\r\n <span>{{ header }}</span>\r\n <span *ngIf=\"users().length\">({{ users().length }} {{ users().length == 1 ? 'participant' :\r\n 'participants'}})</span>\r\n </div>\r\n <div>\r\n <span>{{ metadata }}</span>\r\n </div>\r\n </div>\r\n <div class=\"header-actions\">\r\n <button pButton icon=\"pi pi-users\" (click)=\"toggleUsers()\" style=\"font-size: 0.5rem\"></button>\r\n <button pButton icon=\"pi pi-minus\" (click)=\"toggleMinimize()\" style=\"font-size: 0.5rem\"></button>\r\n <button pButton icon=\"pi pi-trash\" (click)=\"archiveChat()\" style=\"font-size: 0.5rem\"></button>\r\n </div>\r\n </div>\r\n\r\n <div class=\"chat-body\" *ngIf=\"!minimized\">\r\n <div class=\"chat-layout\" [class.users-hidden]=\"!showUsers\">\r\n <div class=\"chat-main\" [class.fullscreen]=\"mode === 'fullscreen'\" [class.floating]=\"mode === 'floating'\">\r\n <div class=\"messages\" #messagesContainer [class.loading]=\"loading\">\r\n <div *ngFor=\"let msg of messages(); trackBy: trackById\" class=\"message-row\"\r\n [ngClass]=\"{ outgoing: msg.senderId === chatService.currentUser().userId, incoming: msg.senderId !== chatService.currentUser().userId }\">\r\n <div class=\"message-bubble\">\r\n <div class=\"message-meta\">\r\n <span class=\"sender\">\r\n <!-- *ngIf=\"msg.senderId !== chatService.currentUser().userId\" -->\r\n {{ msg.senderName }}\r\n </span>\r\n <!-- <span class=\"time\">\r\n {{ msg.createdAt | date: 'shortTime' }}\r\n </span> -->\r\n </div>\r\n\r\n <!-- MESSAGE TEXT -->\r\n <div class=\"message-content\">\r\n {{ msg.content }}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"input-area\">\r\n <div class=\"reply-banner\" *ngIf=\"replyTo\">\r\n <span>Replying to: {{ replyTo.content | slice: 0:50 }}</span>\r\n <button pButton icon=\"pi pi-times\" class=\"p-button-text p-button-sm\" (click)=\"clearReply()\"></button>\r\n </div>\r\n\r\n <textarea pInputTextarea [(ngModel)]=\"newMessage\" rows=\"2\" autoResize=\"true\" placeholder=\"Type a message\"\r\n (keyup.enter)=\"send()\">\r\n </textarea>\r\n\r\n <div class=\"input-actions\">\r\n <button pButton icon=\"pi pi-send\" label=\"Send\" (click)=\"send()\"></button>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"chat-sidebar\">\r\n <div class=\"section-title\">Users</div>\r\n <div class=\"user-list\">\r\n <div class=\"user-row\" *ngFor=\"let u of users()\">\r\n <p-avatar [label]=\"u.username[0]\"></p-avatar>\r\n <span>{{ u.username }}</span>\r\n </div>\r\n </div>\r\n @if(addUserAllowed) {\r\n <div class=\"user-list-add\">\r\n <p-dropdown [options]=\"chatService.userList()\" [(ngModel)]=\"selectedUser\" optionLabel=\"full_name\"\r\n placeholder=\"Select User\" />\r\n <div style=\"margin-top: 2em;\">\r\n <button pButton icon=\"pi pi-plus\" label=\"Add\" (click)=\"addUserToRoom()\"></button>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n</div>", styles: [".chat-window{width:35vw;max-width:95vw;display:flex;flex-direction:column;background:#fff;border-radius:16px;box-shadow:0 8px 30px #0000001f;overflow:visible;font-size:14px;font-family:Inter,system-ui,sans-serif}.chat-window.minimized{height:auto}.chat-header{display:flex;align-items:center;justify-content:space-between;background:#4f6ef7;color:#fff;padding:10px 14px}.chat-header .title{display:flex;flex-direction:row;gap:6px}.chat-header .title span{font-weight:600;font-size:14px}.chat-header .title small{font-size:11px;opacity:.85}.chat-body{display:flex;flex:1;background:#f5f7fb}.chat-layout{display:flex;flex:1;width:100%;overflow:hidden}.chat-layout.users-hidden .chat-sidebar{transform:translate(100%);opacity:0;pointer-events:none;width:0!important}.chat-layout.users-hidden .chat-main{flex:1 1 100%}.chat-main{flex:1;display:flex;flex-direction:column;background:#f5f7fb;height:70vh}.messages{flex:1;padding:16px 14px;overflow-y:auto;scroll-behavior:smooth}.message-row{display:flex;margin-bottom:14px;animation:messageIn .25s ease-out;position:relative;overflow:visible;padding-top:28px}@keyframes messageIn{0%{opacity:0;transform:translateY(6px)}to{opacity:1;transform:translateY(0)}}.message-row.incoming{justify-content:flex-start}.message-row.incoming .reaction-bar{left:12px}.message-row.outgoing{justify-content:flex-end}.message-row.outgoing .reaction-bar{right:12px;left:auto}.message-bubble{position:relative;max-width:72%;padding:10px 14px;border-radius:16px;font-size:14px;line-height:1.45;word-break:break-word;overflow:visible}.message-row.incoming .message-bubble{background:#fff;color:#111;border-top-left-radius:6px;box-shadow:0 3px 10px #0000000f;overflow:visible}.message-bubble:after{content:\"\";position:absolute;bottom:-6px;right:8px}.message-row.incoming .message-bubble:after{content:\"\";position:absolute;left:-6px;top:12px;width:0;height:0;border-top:6px solid transparent;border-bottom:6px solid transparent;border-right:6px solid #ffffff}.message-row.outgoing .message-bubble{background:#4f6ef7;color:#fff;border-top-right-radius:6px;overflow:visible}.message-row.outgoing .message-bubble:after{content:\"\";position:absolute;right:-6px;top:12px;width:0;height:0;border-top:6px solid transparent;border-bottom:6px solid transparent;border-left:6px solid #4f6ef7}.message-meta{display:flex;justify-content:flex-end;font-size:10px;opacity:.6;margin-bottom:4px}.typing-indicator{display:inline-flex;align-items:center;gap:4px;padding:8px 12px;background:#fff;border-radius:14px;box-shadow:0 2px 6px #00000014}.typing-indicator span{width:6px;height:6px;background:#999;border-radius:50%;animation:typingDots 1.4s infinite ease-in-out both}.typing-indicator span:nth-child(1){animation-delay:0s}.typing-indicator span:nth-child(2){animation-delay:.2s}.typing-indicator span:nth-child(3){animation-delay:.4s}@keyframes typingDots{0%{transform:translateY(0);opacity:.4}50%{transform:translateY(-4px);opacity:1}to{transform:translateY(0);opacity:.4}}.input-area{background:#fff;padding:10px;border:1px solid #e5e7eb;display:flex;flex-direction:row;justify-content:space-between;gap:5px}.input-area textarea{max-height:60px;overflow:hidden;width:-webkit-fill-available}.reply-banner{background:#eef2ff;border-left:3px solid #4f6ef7;padding:6px 8px;font-size:12px;border-radius:8px;margin-bottom:6px;display:flex;justify-content:space-between}.input-actions{display:flex;justify-content:flex-end;margin-top:6px}.input-actions button{background:#4f6ef7;color:#fff;border-radius:999px;padding:0 16px}.chat-sidebar{background:#fff;border-left:1px solid #e5e7eb;box-shadow:-4px 0 10px #0000000d;display:flex;flex-direction:column}.section-title{font-weight:600;font-size:13px;padding:10px;border-bottom:1px solid #e5e7eb}.user-list{flex:1;overflow-y:auto;padding:8px;max-height:20em}.user-row{display:flex;align-items:center;gap:8px;padding:6px 8px;border-radius:8px}.user-row:hover{background:#f1f5f9}.user-list-add{padding:10px;border-top:1px solid #e5e7eb}.header-actions{display:flex;align-items:center;gap:6px}.header-actions .p-button{width:32px;height:32px;padding:0;border-radius:50%;background:#ffffff26}.header-actions .p-button:hover{background:#ffffff40}.chat-header{min-height:48px}.header-actions{flex-shrink:0}.header-actions .p-button{transition:background .2s ease,transform .1s ease}.header-actions .p-button:active{transform:scale(.92)}.reaction-bar{position:absolute;top:0;left:12px;transform:translateY(-100%);background:#fff;border-radius:20px;padding:4px 8px;display:none;box-shadow:0 2px 8px #0003;z-index:9999}.message-bubble:hover .reaction-bar{display:flex}.reaction-bar span{cursor:pointer;font-size:16px}.reaction-summary{margin-top:4px;display:flex;gap:6px}.reaction-chip{background:#f1f1f1;padding:2px 6px;border-radius:12px;font-size:12px;position:relative}.reaction-users-tooltip{position:absolute;bottom:130%;left:50%;transform:translate(-50%);white-space:nowrap;background:#222;color:#fff;padding:4px 8px;border-radius:6px;z-index:10000;bottom:calc(100% + 6px)}.message-row,.message-bubble,.reaction-summary{overflow:visible!important}\n"] }]
|
|
190
|
+
], providers: [MessageService], template: "<p-toast></p-toast>\r\n\r\n<div class=\"chat-window\" [class.minimized]=\"minimized\" [class.floating]=\"mode === 'floating'\"\r\n [class.fullscreen]=\"mode === 'fullscreen'\" [class.dark]=\"theme === 'dark'\">\r\n <div class=\"chat-header\">\r\n <div style=\"display: flex; flex-direction: column;\">\r\n <div class=\"title\">\r\n <span>{{ header }}</span>\r\n <span *ngIf=\"users().length\">({{ users().length }} {{ users().length == 1 ? 'participant' :\r\n 'participants'}})</span>\r\n </div>\r\n <div>\r\n <span>{{ metadata }}</span>\r\n </div>\r\n </div>\r\n <div class=\"header-actions\">\r\n <button pButton icon=\"pi pi-users\" (click)=\"toggleUsers()\" style=\"font-size: 0.5rem\" pTooltip=\"Toogle Users\"></button>\r\n <button pButton [icon]=\"minimized ? 'pi pi-plus' : 'pi pi-minus'\" (click)=\"toggleMinimize()\" style=\"font-size: 0.5rem\" pTooltip=\"Hide/Show\"></button>\r\n <button pButton icon=\"pi pi-trash\" (click)=\"archiveChat()\" style=\"font-size: 0.5rem\" pTooltip=\"Archive\"></button>\r\n </div>\r\n </div>\r\n\r\n <div class=\"chat-body\" *ngIf=\"!minimized\">\r\n <div class=\"chat-layout\" [class.users-hidden]=\"!showUsers\">\r\n <div class=\"chat-main\" [class.fullscreen]=\"mode === 'fullscreen'\" [class.floating]=\"mode === 'floating'\">\r\n <div class=\"messages\" #messagesContainer [class.loading]=\"loading\">\r\n <div *ngFor=\"let msg of messages(); trackBy: trackById\" class=\"message-row\"\r\n [ngClass]=\"{ outgoing: msg.senderId === chatService.currentUser().userId, incoming: msg.senderId !== chatService.currentUser().userId }\">\r\n <div class=\"message-bubble\">\r\n <div class=\"message-meta\">\r\n <span class=\"sender\">\r\n <!-- *ngIf=\"msg.senderId !== chatService.currentUser().userId\" -->\r\n {{ msg.senderName }}\r\n </span>\r\n <!-- <span class=\"time\">\r\n {{ msg.createdAt | date: 'shortTime' }}\r\n </span> -->\r\n </div>\r\n\r\n <!-- MESSAGE TEXT -->\r\n <div class=\"message-content\">\r\n {{ msg.content }}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"input-area\">\r\n <div class=\"reply-banner\" *ngIf=\"replyTo\">\r\n <span>Replying to: {{ replyTo.content | slice: 0:50 }}</span>\r\n <button pButton icon=\"pi pi-times\" class=\"p-button-text p-button-sm\" (click)=\"clearReply()\"></button>\r\n </div>\r\n\r\n <textarea pInputTextarea [(ngModel)]=\"newMessage\" rows=\"2\" autoResize=\"true\" placeholder=\"Type a message\"\r\n (keyup.enter)=\"send()\">\r\n </textarea>\r\n\r\n <div class=\"input-actions\">\r\n <button pButton icon=\"pi pi-send\" label=\"Send\" (click)=\"send()\"></button>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"chat-sidebar\">\r\n <div class=\"section-title\">Users</div>\r\n <div class=\"user-list\">\r\n <div class=\"user-row\" *ngFor=\"let u of users()\">\r\n <p-avatar [label]=\"u.username[0]\"></p-avatar>\r\n <span>{{ u.username }}</span>\r\n </div>\r\n </div>\r\n @if(addUserAllowed) {\r\n <div class=\"user-list-add\">\r\n <p-dropdown [options]=\"chatService.userList()\" [(ngModel)]=\"selectedUser\" optionLabel=\"full_name\"\r\n placeholder=\"Select User\" />\r\n <div style=\"margin-top: 2em;\">\r\n <button pButton icon=\"pi pi-plus\" label=\"Add\" (click)=\"addUserToRoom()\"></button>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n</div>", styles: [".chat-window{width:35vw;max-width:95vw;display:flex;flex-direction:column;background:#fff;border-radius:16px;box-shadow:0 8px 30px #0000001f;overflow:visible;font-size:14px;font-family:Inter,system-ui,sans-serif}.chat-window.minimized{height:auto}.chat-header{display:flex;align-items:center;justify-content:space-between;background:#4f6ef7;color:#fff;padding:10px 14px}.chat-header .title{display:flex;flex-direction:row;gap:6px}.chat-header .title span{font-weight:600;font-size:14px}.chat-header .title small{font-size:11px;opacity:.85}.chat-body{display:flex;flex:1;background:#f5f7fb}.chat-layout{display:flex;flex:1;width:100%;overflow:hidden}.chat-layout.users-hidden .chat-sidebar{transform:translate(100%);opacity:0;pointer-events:none;width:0!important}.chat-layout.users-hidden .chat-main{flex:1 1 100%}.chat-main{flex:1;display:flex;flex-direction:column;background:#f5f7fb;height:70vh}.messages{flex:1;padding:16px 14px;overflow-y:auto;scroll-behavior:smooth}.message-row{display:flex;margin-bottom:14px;animation:messageIn .25s ease-out;position:relative;overflow:visible;padding-top:28px}@keyframes messageIn{0%{opacity:0;transform:translateY(6px)}to{opacity:1;transform:translateY(0)}}.message-row.incoming{justify-content:flex-start}.message-row.incoming .reaction-bar{left:12px}.message-row.outgoing{justify-content:flex-end}.message-row.outgoing .reaction-bar{right:12px;left:auto}.message-bubble{position:relative;max-width:72%;padding:10px 14px;border-radius:16px;font-size:14px;line-height:1.45;word-break:break-word;overflow:visible}.message-row.incoming .message-bubble{background:#fff;color:#111;border-top-left-radius:6px;box-shadow:0 3px 10px #0000000f;overflow:visible}.message-bubble:after{content:\"\";position:absolute;bottom:-6px;right:8px}.message-row.incoming .message-bubble:after{content:\"\";position:absolute;left:-6px;top:12px;width:0;height:0;border-top:6px solid transparent;border-bottom:6px solid transparent;border-right:6px solid #ffffff}.message-row.outgoing .message-bubble{background:#4f6ef7;color:#fff;border-top-right-radius:6px;overflow:visible}.message-row.outgoing .message-bubble:after{content:\"\";position:absolute;right:-6px;top:12px;width:0;height:0;border-top:6px solid transparent;border-bottom:6px solid transparent;border-left:6px solid #4f6ef7}.message-meta{display:flex;justify-content:flex-end;font-size:10px;opacity:.6;margin-bottom:4px}.typing-indicator{display:inline-flex;align-items:center;gap:4px;padding:8px 12px;background:#fff;border-radius:14px;box-shadow:0 2px 6px #00000014}.typing-indicator span{width:6px;height:6px;background:#999;border-radius:50%;animation:typingDots 1.4s infinite ease-in-out both}.typing-indicator span:nth-child(1){animation-delay:0s}.typing-indicator span:nth-child(2){animation-delay:.2s}.typing-indicator span:nth-child(3){animation-delay:.4s}@keyframes typingDots{0%{transform:translateY(0);opacity:.4}50%{transform:translateY(-4px);opacity:1}to{transform:translateY(0);opacity:.4}}.input-area{background:#fff;padding:10px;border:1px solid #e5e7eb;display:flex;flex-direction:row;justify-content:space-between;gap:5px}.input-area textarea{max-height:60px;overflow:hidden;width:-webkit-fill-available}.reply-banner{background:#eef2ff;border-left:3px solid #4f6ef7;padding:6px 8px;font-size:12px;border-radius:8px;margin-bottom:6px;display:flex;justify-content:space-between}.input-actions{display:flex;justify-content:flex-end;margin-top:6px}.input-actions button{background:#4f6ef7;color:#fff;border-radius:999px;padding:0 16px}.chat-sidebar{background:#fff;border-left:1px solid #e5e7eb;box-shadow:-4px 0 10px #0000000d;display:flex;flex-direction:column}.section-title{font-weight:600;font-size:13px;padding:10px;border-bottom:1px solid #e5e7eb}.user-list{flex:1;overflow-y:auto;padding:8px;max-height:20em}.user-row{display:flex;align-items:center;gap:8px;padding:6px 8px;border-radius:8px}.user-row:hover{background:#f1f5f9}.user-list-add{padding:10px;border-top:1px solid #e5e7eb}.header-actions{display:flex;align-items:center;gap:6px}.header-actions .p-button{width:32px;height:32px;padding:0;border-radius:50%;background:#ffffff26}.header-actions .p-button:hover{background:#ffffff40}.chat-header{min-height:48px}.header-actions{flex-shrink:0}.header-actions .p-button{transition:background .2s ease,transform .1s ease}.header-actions .p-button:active{transform:scale(.92)}.reaction-bar{position:absolute;top:0;left:12px;transform:translateY(-100%);background:#fff;border-radius:20px;padding:4px 8px;display:none;box-shadow:0 2px 8px #0003;z-index:9999}.message-bubble:hover .reaction-bar{display:flex}.reaction-bar span{cursor:pointer;font-size:16px}.reaction-summary{margin-top:4px;display:flex;gap:6px}.reaction-chip{background:#f1f1f1;padding:2px 6px;border-radius:12px;font-size:12px;position:relative}.reaction-users-tooltip{position:absolute;bottom:130%;left:50%;transform:translate(-50%);white-space:nowrap;background:#222;color:#fff;padding:4px 8px;border-radius:6px;z-index:10000;bottom:calc(100% + 6px)}.message-row,.message-bubble,.reaction-summary{overflow:visible!important}\n"] }]
|
|
190
191
|
}], ctorParameters: () => [], propDecorators: { chatRoomId: [{
|
|
191
192
|
type: Input
|
|
192
193
|
}], header: [{
|
|
@@ -210,4 +211,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
210
211
|
type: ViewChild,
|
|
211
212
|
args: ['reactionOverlay']
|
|
212
213
|
}] } });
|
|
213
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhdC13aW5kb3cuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2hhdC13aWRnZXQvc3JjL2xpYi9jaGF0LXdpbmRvdy9jaGF0LXdpbmRvdy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jaGF0LXdpZGdldC9zcmMvbGliL2NoYXQtd2luZG93L2NoYXQtd2luZG93LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQWMsWUFBWSxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQWlCLFNBQVMsRUFBVSxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNwSixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUM1RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDaEUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM1QyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzdDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM5QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzVELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBRTFDLE9BQU8s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WCxZQUFZLDRPQUNaLFlBQVksa09BQ1osYUFBYSw4QkFDYixtQkFBbUIscUtBQ25CLFVBQVUsOEJBQ1YsY0FBYyx1dENBQ2Qsa0JBQWtCOzs0RkFNVCxtQkFBbUI7a0JBbkIvQixTQUFTOytCQUNFLGlCQUFpQixjQUNmLElBQUksV0FDUDt3QkFDUCxZQUFZO3dCQUNaLFdBQVc7d0JBQ1gsV0FBVzt3QkFDWCxZQUFZO3dCQUNaLFlBQVk7d0JBQ1osYUFBYTt3QkFDYixtQkFBbUI7d0JBQ25CLFVBQVU7d0JBQ1YsY0FBYzt3QkFDZCxrQkFBa0I7cUJBQ25CLGFBR1UsQ0FBQyxjQUFjLENBQUM7d0RBR2xCLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csTUFBTTtzQkFBZCxLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFDRyxjQUFjO3NCQUF0QixLQUFLO2dCQUNHLElBQUk7c0JBQVosS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0ksU0FBUztzQkFBbEIsTUFBTTtnQkFpQnlCLGlCQUFpQjtzQkFBaEQsU0FBUzt1QkFBQyxtQkFBbUI7Z0JBQ0EsZUFBZTtzQkFBNUMsU0FBUzt1QkFBQyxpQkFBaUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uSW5pdCwgT3V0cHV0LCBTaW1wbGVDaGFuZ2VzLCBWaWV3Q2hpbGQsIGVmZmVjdCwgaW5qZWN0LCBpbnB1dCwgc2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBDaGF0U2VydmljZSB9IGZyb20gJy4uL2NvcmUvc2VydmljZXMvY2hhdC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgU29ja2V0U2VydmljZSB9IGZyb20gJy4uL2NvcmUvc2VydmljZXMvc29ja2V0LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBUb2FzdE1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvdG9hc3QnO1xyXG5pbXBvcnQgeyBNZXNzYWdlU2VydmljZSB9IGZyb20gJ3ByaW1lbmcvYXBpJztcclxuaW1wb3J0IHsgQnV0dG9uTW9kdWxlIH0gZnJvbSAncHJpbWVuZy9idXR0b24nO1xyXG5pbXBvcnQgeyBBdmF0YXJNb2R1bGUgfSBmcm9tICdwcmltZW5nL2F2YXRhcic7XHJcbmltcG9ydCB7IFRvb2x0aXBNb2R1bGUgfSBmcm9tICdwcmltZW5nL3Rvb2x0aXAnO1xyXG5pbXBvcnQgeyBJbnB1dFRleHRhcmVhTW9kdWxlIH0gZnJvbSAncHJpbWVuZy9pbnB1dHRleHRhcmVhJztcclxuaW1wb3J0IHsgRHJvcGRvd25Nb2R1bGUgfSBmcm9tICdwcmltZW5nL2Ryb3Bkb3duJztcclxuaW1wb3J0IHsgQ2hpcE1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvY2hpcCc7XHJcbmltcG9ydCB7IENoYXRNZXNzYWdlIH0gZnJvbSAnLi4vY29yZS9tb2RlbHMvY2hhdC5tb2RlbHMnO1xyXG5pbXBvcnQgeyBPdmVybGF5UGFuZWxNb2R1bGUgfSBmcm9tICdwcmltZW5nL292ZXJsYXlwYW5lbCc7XHJcbmltcG9ydCB7IE92ZXJsYXlQYW5lbCB9IGZyb20gJ3ByaW1lbmcvb3ZlcmxheXBhbmVsJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnYXBwLWNoYXQtd2luZG93JyxcclxuICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gIGltcG9ydHM6IFtcclxuICAgIENvbW1vbk1vZHVsZSxcclxuICAgIEZvcm1zTW9kdWxlLFxyXG4gICAgVG9hc3RNb2R1bGUsXHJcbiAgICBCdXR0b25Nb2R1bGUsXHJcbiAgICBBdmF0YXJNb2R1bGUsXHJcbiAgICBUb29sdGlwTW9kdWxlLFxyXG4gICAgSW5wdXRUZXh0YXJlYU1vZHVsZSxcclxuICAgIENoaXBNb2R1bGUsXHJcbiAgICBEcm9wZG93bk1vZHVsZSxcclxuICAgIE92ZXJsYXlQYW5lbE1vZHVsZVxyXG4gIF0sXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2NoYXQtd2luZG93LmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9jaGF0LXdpbmRvdy5jb21wb25lbnQuc2NzcyddLFxyXG4gIHByb3ZpZGVyczogW01lc3NhZ2VTZXJ2aWNlXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgQ2hhdFdpbmRvd0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcbiAgQElucHV0KCkgY2hhdFJvb21JZCE6IHN0cmluZztcclxuICBASW5wdXQoKSBoZWFkZXIgPSAnQ2hhdCc7XHJcbiAgQElucHV0KCkgbWV0YWRhdGEgPSAnJztcclxuICBASW5wdXQoKSBjaGF0VXNlcnMgPSBbXTtcclxuICBASW5wdXQoKSBhZGRVc2VyQWxsb3dlZCA9IHRydWU7XHJcbiAgQElucHV0KCkgbW9kZTogJ2Zsb2F0aW5nJyB8ICdmdWxsc2NyZWVuJyA9ICdmbG9hdGluZyc7XHJcbiAgQElucHV0KCkgdGhlbWU6ICdsaWdodCcgfCAnZGFyaycgPSAnbGlnaHQnO1xyXG4gIEBPdXRwdXQoKSBvbkFyY2hpdmUgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcblxyXG4gIHJlZnJlc2hSb29tID0gaW5wdXQ8Ym9vbGVhbj4oZmFsc2UpO1xyXG4gIC8vIEBJbnB1dCgpIGN1cnJlbnRVc2VyOiBhbnk7XHJcblxyXG4gIGNoYXRTZXJ2aWNlID0gaW5qZWN0KENoYXRTZXJ2aWNlKTtcclxuICBzb2NrZXQgPSBpbmplY3QoU29ja2V0U2VydmljZSk7XHJcbiAgbWVzc2FnZVNlcnZpY2UgPSBpbmplY3QoTWVzc2FnZVNlcnZpY2UpO1xyXG5cclxuICB1c2VycyA9IHNpZ25hbDxhbnlbXT4oW10pO1xyXG4gIG1lc3NhZ2VzID0gc2lnbmFsPENoYXRNZXNzYWdlW10+KFtdKTtcclxuICBuZXdNZXNzYWdlID0gJyc7XHJcbiAgbWluaW1pemVkID0gZmFsc2U7XHJcbiAgbG9hZGluZyA9IGZhbHNlO1xyXG4gIHJlcGx5VG86IENoYXRNZXNzYWdlIHwgbnVsbCA9IG51bGw7XHJcbiAgc2VsZWN0ZWRVc2VyOiBhbnk7XHJcblxyXG4gIEBWaWV3Q2hpbGQoJ21lc3NhZ2VzQ29udGFpbmVyJykgbWVzc2FnZXNDb250YWluZXIhOiBFbGVtZW50UmVmPEhUTUxEaXZFbGVtZW50PjtcclxuICBAVmlld0NoaWxkKCdyZWFjdGlvbk92ZXJsYXknKSByZWFjdGlvbk92ZXJsYXkhOiBPdmVybGF5UGFuZWw7XHJcblxyXG4gIHByaXZhdGUgb2JzZXJ2ZXIhOiBNdXRhdGlvbk9ic2VydmVyO1xyXG5cclxuICBzaG93VXNlcnMgPSBmYWxzZTtcclxuICBzdWdnZXN0aW9uID0gJyc7XHJcbiAgaG92ZXJlZFJlYWN0aW9uVXNlcnM6IHN0cmluZ1tdID0gW107XHJcblxyXG4gIGNvbnN0cnVjdG9yKCkge1xyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICB0aGlzLnNvY2tldC5qb2luUm9vbSh0aGlzLmNoYXRSb29tSWQpO1xyXG4gICAgdGhpcy5zb2NrZXQuam9pblVzZXJDaGFubmVsKHRoaXMuY2hhdFNlcnZpY2UuY3VycmVudFVzZXIoKS51c2VySWQpO1xyXG4gICAgdGhpcy5sb2FkVXNlcnMoKTtcclxuICAgIHRoaXMubG9hZE1lc3NhZ2VzKCk7XHJcbiAgICB0aGlzLmxpc3RlblNvY2tldCgpO1xyXG4gIH1cclxuXHJcbiAgbG9hZFVzZXJzKCkge1xyXG4gICAgdGhpcy5jaGF0U2VydmljZS5nZXRSb29tVXNlcnModGhpcy5jaGF0Um9vbUlkKS5zdWJzY3JpYmUodXNlcnMgPT4ge1xyXG4gICAgICB0aGlzLnVzZXJzLnNldCh1c2Vycyk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGxvYWRNZXNzYWdlcygpIHtcclxuICAgIHRoaXMubG9hZGluZyA9IHRydWU7XHJcbiAgICB0aGlzLmNoYXRTZXJ2aWNlLmdldE1lc3NhZ2VzKHRoaXMuY2hhdFJvb21JZCkuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogbXNncyA9PiB7XHJcbiAgICAgICAgdGhpcy5tZXNzYWdlcy5zZXQobXNncyk7XHJcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgIH0sXHJcbiAgICAgIGVycm9yOiAoKSA9PiAodGhpcy5sb2FkaW5nID0gZmFsc2UpXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGxpc3RlblNvY2tldCgpIHtcclxuICAgIHRoaXMuc29ja2V0Lm9uPENoYXRNZXNzYWdlPignbmV3TWVzc2FnZScpLnN1YnNjcmliZShtc2cgPT4ge1xyXG4gICAgICBpZiAobXNnLmNoYXRSb29tSWQgPT09IHRoaXMuY2hhdFJvb21JZCkge1xyXG4gICAgICAgIHRoaXMubWVzc2FnZXMudXBkYXRlKGxpc3QgPT4gWy4uLmxpc3QsIG1zZ10pO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBpZiAobXNnLnNlbmRlcklkICE9PSB0aGlzLmNoYXRTZXJ2aWNlLmN1cnJlbnRVc2VyKCkudXNlcklkKSB7XHJcbiAgICAgIC8vICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoe1xyXG4gICAgICAvLyAgICAgc2V2ZXJpdHk6ICdpbmZvJyxcclxuICAgICAgLy8gICAgIHN1bW1hcnk6IHRoaXMuaGVhZGVyLFxyXG4gICAgICAvLyAgICAgZGV0YWlsOiBtc2cuY29udGVudCA/PyAnTmV3IG1lc3NhZ2UnLFxyXG4gICAgICAvLyAgICAgbGlmZTogMjUwMFxyXG4gICAgICAvLyAgIH0pO1xyXG4gICAgICAvLyB9XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLnNvY2tldC5vbigncm9vbVVzZXJBZGRlZCcpLnN1YnNjcmliZSgobXNnOiBhbnkpID0+IHtcclxuICAgICAgaWYgKG1zZy5jaGF0Um9vbUlkID09PSB0aGlzLmNoYXRSb29tSWQpIHtcclxuICAgICAgICB0aGlzLmxvYWRVc2VycygpO1xyXG4gICAgICAgIC8vIHRoaXMubWVzc2FnZVNlcnZpY2UuYWRkKHtcclxuICAgICAgICAvLyAgIHNldmVyaXR5OiAnaW5mbycsXHJcbiAgICAgICAgLy8gICBzdW1tYXJ5OiAnVXNlciBBZGRlZCcsXHJcbiAgICAgICAgLy8gICBkZXRhaWw6IG1zZy51c2VyPy51c2VyTmFtZSxcclxuICAgICAgICAvLyAgIGxpZmU6IDI1MDBcclxuICAgICAgICAvLyB9KTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5zb2NrZXQub24oJ2FkZGVkVG9Sb29tJykuc3Vic2NyaWJlKChtc2c6IGFueSkgPT4ge1xyXG4gICAgICBpZiAobXNnLmNoYXRSb29tSWQgPT09IHRoaXMuY2hhdFJvb21JZCkge1xyXG4gICAgICAgIHRoaXMubG9hZFVzZXJzKCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuc29ja2V0Lm9uKCd1c2VyQWxyZWFkeUluUm9vbScpLnN1YnNjcmliZSgobXNnOiBhbnkpID0+IHtcclxuICAgICAgLy8gaWYgKG1zZy5jaGF0Um9vbUlkID09PSB0aGlzLmNoYXRSb29tSWQpIHtcclxuICAgICAgLy8gICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFkZCh7XHJcbiAgICAgIC8vICAgICBzZXZlcml0eTogJ2luZm8nLFxyXG4gICAgICAvLyAgICAgc3VtbWFyeTogJ1VzZXIgQWxyZWFkeSBBZGRlZCcsXHJcbiAgICAgIC8vICAgICBkZXRhaWw6IG1zZy51c2VyPy51c2VyTmFtZSxcclxuICAgICAgLy8gICAgIGxpZmU6IDI1MDBcclxuICAgICAgLy8gICB9KTtcclxuICAgICAgLy8gfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBzZW5kKCkge1xyXG4gICAgY29uc3QgY29udGVudCA9IHRoaXMubmV3TWVzc2FnZS50cmltKCk7XHJcbiAgICBpZiAoIWNvbnRlbnQpIHJldHVybjtcclxuXHJcbiAgICB0aGlzLmNoYXRTZXJ2aWNlXHJcbiAgICAgIC5zZW5kTWVzc2FnZSh0aGlzLmNoYXRSb29tSWQsIHtcclxuICAgICAgICBzZW5kZXJJZDogdGhpcy5jaGF0U2VydmljZS5jdXJyZW50VXNlcigpLnVzZXJJZCxcclxuICAgICAgICBzZW5kZXJOYW1lOiB0aGlzLmNoYXRTZXJ2aWNlLmN1cnJlbnRVc2VyKCkubmFtZSxcclxuICAgICAgICBjb250ZW50LFxyXG4gICAgICAgIHJlcGx5VG9NZXNzYWdlSWQ6IHRoaXMucmVwbHlUbz8ucmVwbHlUb01lc3NhZ2VJZCA/PyBudWxsLFxyXG4gICAgICAgIGNyZWF0ZWRCeTogdGhpcy5jaGF0U2VydmljZS5jdXJyZW50VXNlcigpLnVzZXJJZFxyXG4gICAgICB9KVxyXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgICB0aGlzLm5ld01lc3NhZ2UgPSAnJztcclxuICAgICAgICB0aGlzLnJlcGx5VG8gPSBudWxsO1xyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIGFkZFVzZXJUb1Jvb20oKSB7XHJcbiAgICB0aGlzLmNoYXRTZXJ2aWNlXHJcbiAgICAgIC5hZGRVc2VyVG9Sb29tKFxyXG4gICAgICAgIHRoaXMuY2hhdFJvb21JZCxcclxuICAgICAgICB0aGlzLnNlbGVjdGVkVXNlcj8udXNlcl9pZCxcclxuICAgICAgICB0aGlzLnNlbGVjdGVkVXNlcj8uZnVsbF9uYW1lLFxyXG4gICAgICAgIHRoaXMuY2hhdFNlcnZpY2UuY3VycmVudFVzZXIoKS51c2VySWQpXHJcbiAgICAgIC5zdWJzY3JpYmUoKHJlcykgPT4ge1xyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIHRvZ2dsZU1pbmltaXplKCkge1xyXG4gICAgdGhpcy5taW5pbWl6ZWQgPSAhdGhpcy5taW5pbWl6ZWQ7XHJcbiAgfVxyXG5cclxuICBhcmNoaXZlQ2hhdCgpIHtcclxuICAgIHRoaXMuY2hhdFNlcnZpY2UuYXJjaGl2ZVJvb20odGhpcy5jaGF0Um9vbUlkKS5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiAoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5vbkFyY2hpdmUuZW1pdCh0aGlzLmNoYXRSb29tSWQpO1xyXG4gICAgICB9LFxyXG4gICAgICBlcnJvcjogZXJyID0+IGNvbnNvbGUuZXJyb3IoZXJyKVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBzZXRSZXBseShtc2c6IENoYXRNZXNzYWdlKSB7XHJcbiAgICB0aGlzLnJlcGx5VG8gPSBtc2c7XHJcbiAgfVxyXG5cclxuICBjbGVhclJlcGx5KCkge1xyXG4gICAgdGhpcy5yZXBseVRvID0gbnVsbDtcclxuICB9XHJcblxyXG4gIHRyYWNrQnlJZChpbmRleDogbnVtYmVyLCBtc2c6IENoYXRNZXNzYWdlKSB7XHJcbiAgICByZXR1cm4gbXNnLmlkO1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKSB7XHJcbiAgICB0aGlzLnNvY2tldC5vZmZOZXdNZXNzYWdlKCk7XHJcbiAgICB0aGlzLnNvY2tldC5vZmZNZXNzYWdlU2VlbigpO1xyXG4gICAgdGhpcy5vYnNlcnZlcj8uZGlzY29ubmVjdCgpO1xyXG4gIH1cclxuXHJcbiAgbmdBZnRlclZpZXdJbml0KCkge1xyXG4gICAgY29uc3QgZWwgPSB0aGlzLm1lc3NhZ2VzQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQ7XHJcblxyXG4gICAgdGhpcy5vYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKCgpID0+IHtcclxuICAgICAgLy8g8J+UpSBTY3JvbGwgQUZURVIgRE9NIGFjdHVhbGx5IGNoYW5nZXNcclxuICAgICAgZWwuc2Nyb2xsVG9wID0gZWwuc2Nyb2xsSGVpZ2h0O1xyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5vYnNlcnZlci5vYnNlcnZlKGVsLCB7XHJcbiAgICAgIGNoaWxkTGlzdDogdHJ1ZSxcclxuICAgICAgc3VidHJlZTogdHJ1ZSxcclxuICAgICAgY2hhcmFjdGVyRGF0YTogdHJ1ZVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICB0b2dnbGVVc2VycygpIHtcclxuICAgIHRoaXMuc2hvd1VzZXJzID0gIXRoaXMuc2hvd1VzZXJzO1xyXG4gIH1cclxufVxyXG4iLCI8cC10b2FzdD48L3AtdG9hc3Q+XHJcblxyXG48ZGl2IGNsYXNzPVwiY2hhdC13aW5kb3dcIiBbY2xhc3MubWluaW1pemVkXT1cIm1pbmltaXplZFwiIFtjbGFzcy5mbG9hdGluZ109XCJtb2RlID09PSAnZmxvYXRpbmcnXCJcclxuICBbY2xhc3MuZnVsbHNjcmVlbl09XCJtb2RlID09PSAnZnVsbHNjcmVlbidcIiBbY2xhc3MuZGFya109XCJ0aGVtZSA9PT0gJ2RhcmsnXCI+XHJcbiAgPGRpdiBjbGFzcz1cImNoYXQtaGVhZGVyXCI+XHJcbiAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cInRpdGxlXCI+XHJcbiAgICAgICAgPHNwYW4+e3sgaGVhZGVyIH19PC9zcGFuPlxyXG4gICAgICAgIDxzcGFuICpuZ0lmPVwidXNlcnMoKS5sZW5ndGhcIj4oe3sgdXNlcnMoKS5sZW5ndGggfX0ge3sgdXNlcnMoKS5sZW5ndGggPT0gMSA/ICdwYXJ0aWNpcGFudCcgOlxyXG4gICAgICAgICAgJ3BhcnRpY2lwYW50cyd9fSk8L3NwYW4+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2PlxyXG4gICAgICAgIDxzcGFuPnt7IG1ldGFkYXRhIH19PC9zcGFuPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cImhlYWRlci1hY3Rpb25zXCI+XHJcbiAgICAgIDxidXR0b24gcEJ1dHRvbiBpY29uPVwicGkgcGktdXNlcnNcIiAoY2xpY2spPVwidG9nZ2xlVXNlcnMoKVwiIHN0eWxlPVwiZm9udC1zaXplOiAwLjVyZW1cIj48L2J1dHRvbj5cclxuICAgICAgPGJ1dHRvbiBwQnV0dG9uIGljb249XCJwaSBwaS1taW51c1wiIChjbGljayk9XCJ0b2dnbGVNaW5pbWl6ZSgpXCIgc3R5bGU9XCJmb250LXNpemU6IDAuNXJlbVwiPjwvYnV0dG9uPlxyXG4gICAgICA8YnV0dG9uIHBCdXR0b24gaWNvbj1cInBpIHBpLXRyYXNoXCIgKGNsaWNrKT1cImFyY2hpdmVDaGF0KClcIiBzdHlsZT1cImZvbnQtc2l6ZTogMC41cmVtXCI+PC9idXR0b24+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuXHJcbiAgPGRpdiBjbGFzcz1cImNoYXQtYm9keVwiICpuZ0lmPVwiIW1pbmltaXplZFwiPlxyXG4gICAgPGRpdiBjbGFzcz1cImNoYXQtbGF5b3V0XCIgW2NsYXNzLnVzZXJzLWhpZGRlbl09XCIhc2hvd1VzZXJzXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJjaGF0LW1haW5cIiBbY2xhc3MuZnVsbHNjcmVlbl09XCJtb2RlID09PSAnZnVsbHNjcmVlbidcIiBbY2xhc3MuZmxvYXRpbmddPVwibW9kZSA9PT0gJ2Zsb2F0aW5nJ1wiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJtZXNzYWdlc1wiICNtZXNzYWdlc0NvbnRhaW5lciBbY2xhc3MubG9hZGluZ109XCJsb2FkaW5nXCI+XHJcbiAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBtc2cgb2YgbWVzc2FnZXMoKTsgdHJhY2tCeTogdHJhY2tCeUlkXCIgY2xhc3M9XCJtZXNzYWdlLXJvd1wiXHJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgb3V0Z29pbmc6IG1zZy5zZW5kZXJJZCA9PT0gY2hhdFNlcnZpY2UuY3VycmVudFVzZXIoKS51c2VySWQsIGluY29taW5nOiBtc2cuc2VuZGVySWQgIT09IGNoYXRTZXJ2aWNlLmN1cnJlbnRVc2VyKCkudXNlcklkIH1cIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1lc3NhZ2UtYnViYmxlXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1lc3NhZ2UtbWV0YVwiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZW5kZXJcIj5cclxuICAgICAgICAgICAgICAgICAgPCEtLSAqbmdJZj1cIm1zZy5zZW5kZXJJZCAhPT0gY2hhdFNlcnZpY2UuY3VycmVudFVzZXIoKS51c2VySWRcIiAtLT5cclxuICAgICAgICAgICAgICAgICAge3sgbXNnLnNlbmRlck5hbWUgfX1cclxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwhLS0gPHNwYW4gY2xhc3M9XCJ0aW1lXCI+XHJcbiAgICAgICAgICAgICAgICAgIHt7IG1zZy5jcmVhdGVkQXQgfCBkYXRlOiAnc2hvcnRUaW1lJyB9fVxyXG4gICAgICAgICAgICAgICAgPC9zcGFuPiAtLT5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgPCEtLSBNRVNTQUdFIFRFWFQgLS0+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1lc3NhZ2UtY29udGVudFwiPlxyXG4gICAgICAgICAgICAgICAge3sgbXNnLmNvbnRlbnQgfX1cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtYXJlYVwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInJlcGx5LWJhbm5lclwiICpuZ0lmPVwicmVwbHlUb1wiPlxyXG4gICAgICAgICAgICA8c3Bhbj5SZXBseWluZyB0bzoge3sgcmVwbHlUby5jb250ZW50IHwgc2xpY2U6IDA6NTAgfX08L3NwYW4+XHJcbiAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiBpY29uPVwicGkgcGktdGltZXNcIiBjbGFzcz1cInAtYnV0dG9uLXRleHQgcC1idXR0b24tc21cIiAoY2xpY2spPVwiY2xlYXJSZXBseSgpXCI+PC9idXR0b24+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICA8dGV4dGFyZWEgcElucHV0VGV4dGFyZWEgWyhuZ01vZGVsKV09XCJuZXdNZXNzYWdlXCIgcm93cz1cIjJcIiBhdXRvUmVzaXplPVwidHJ1ZVwiIHBsYWNlaG9sZGVyPVwiVHlwZSBhIG1lc3NhZ2VcIlxyXG4gICAgICAgICAgICAoa2V5dXAuZW50ZXIpPVwic2VuZCgpXCI+XHJcbiAgICAgICAgICA8L3RleHRhcmVhPlxyXG5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1hY3Rpb25zXCI+XHJcbiAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiBpY29uPVwicGkgcGktc2VuZFwiIGxhYmVsPVwiU2VuZFwiIChjbGljayk9XCJzZW5kKClcIj48L2J1dHRvbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiBjbGFzcz1cImNoYXQtc2lkZWJhclwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzZWN0aW9uLXRpdGxlXCI+VXNlcnM8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwidXNlci1saXN0XCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidXNlci1yb3dcIiAqbmdGb3I9XCJsZXQgdSBvZiB1c2VycygpXCI+XHJcbiAgICAgICAgICAgIDxwLWF2YXRhciBbbGFiZWxdPVwidS51c2VybmFtZVswXVwiPjwvcC1hdmF0YXI+XHJcbiAgICAgICAgICAgIDxzcGFuPnt7IHUudXNlcm5hbWUgfX08L3NwYW4+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICBAaWYoYWRkVXNlckFsbG93ZWQpIHtcclxuICAgICAgICA8ZGl2IGNsYXNzPVwidXNlci1saXN0LWFkZFwiPlxyXG4gICAgICAgICAgPHAtZHJvcGRvd24gW29wdGlvbnNdPVwiY2hhdFNlcnZpY2UudXNlckxpc3QoKVwiIFsobmdNb2RlbCldPVwic2VsZWN0ZWRVc2VyXCIgb3B0aW9uTGFiZWw9XCJmdWxsX25hbWVcIlxyXG4gICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlbGVjdCBVc2VyXCIgLz5cclxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOiAyZW07XCI+XHJcbiAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiBpY29uPVwicGkgcGktcGx1c1wiIGxhYmVsPVwiQWRkXCIgKGNsaWNrKT1cImFkZFVzZXJUb1Jvb20oKVwiPjwvYnV0dG9uPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgfVxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG48L2Rpdj4iXX0=
|
|
214
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhdC13aW5kb3cuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2hhdC13aWRnZXQvc3JjL2xpYi9jaGF0LXdpbmRvdy9jaGF0LXdpbmRvdy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jaGF0LXdpZGdldC9zcmMvbGliL2NoYXQtd2luZG93L2NoYXQtd2luZG93LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQWMsWUFBWSxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQWlCLFNBQVMsRUFBVSxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNwSixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUM1RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDaEUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM1QyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzdDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM5QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzVELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBRTFDLE9BQU8s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Q1gsWUFBWSw0T0FDWixZQUFZLGtPQUNaLGFBQWEscVhBQ2IsbUJBQW1CLHFLQUNuQixVQUFVLDhCQUNWLGNBQWMsdXRDQUNkLGtCQUFrQjs7NEZBTVQsbUJBQW1CO2tCQW5CL0IsU0FBUzsrQkFDRSxpQkFBaUIsY0FDZixJQUFJLFdBQ1A7d0JBQ1AsWUFBWTt3QkFDWixXQUFXO3dCQUNYLFdBQVc7d0JBQ1gsWUFBWTt3QkFDWixZQUFZO3dCQUNaLGFBQWE7d0JBQ2IsbUJBQW1CO3dCQUNuQixVQUFVO3dCQUNWLGNBQWM7d0JBQ2Qsa0JBQWtCO3FCQUNuQixhQUdVLENBQUMsY0FBYyxDQUFDO3dEQUdsQixVQUFVO3NCQUFsQixLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csY0FBYztzQkFBdEIsS0FBSztnQkFDRyxJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUNJLFNBQVM7c0JBQWxCLE1BQU07Z0JBaUJ5QixpQkFBaUI7c0JBQWhELFNBQVM7dUJBQUMsbUJBQW1CO2dCQUNBLGVBQWU7c0JBQTVDLFNBQVM7dUJBQUMsaUJBQWlCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkluaXQsIE91dHB1dCwgU2ltcGxlQ2hhbmdlcywgVmlld0NoaWxkLCBlZmZlY3QsIGluamVjdCwgaW5wdXQsIHNpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQgeyBGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgQ2hhdFNlcnZpY2UgfSBmcm9tICcuLi9jb3JlL3NlcnZpY2VzL2NoYXQuc2VydmljZSc7XHJcbmltcG9ydCB7IFNvY2tldFNlcnZpY2UgfSBmcm9tICcuLi9jb3JlL3NlcnZpY2VzL3NvY2tldC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgVG9hc3RNb2R1bGUgfSBmcm9tICdwcmltZW5nL3RvYXN0JztcclxuaW1wb3J0IHsgTWVzc2FnZVNlcnZpY2UgfSBmcm9tICdwcmltZW5nL2FwaSc7XHJcbmltcG9ydCB7IEJ1dHRvbk1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvYnV0dG9uJztcclxuaW1wb3J0IHsgQXZhdGFyTW9kdWxlIH0gZnJvbSAncHJpbWVuZy9hdmF0YXInO1xyXG5pbXBvcnQgeyBUb29sdGlwTW9kdWxlIH0gZnJvbSAncHJpbWVuZy90b29sdGlwJztcclxuaW1wb3J0IHsgSW5wdXRUZXh0YXJlYU1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvaW5wdXR0ZXh0YXJlYSc7XHJcbmltcG9ydCB7IERyb3Bkb3duTW9kdWxlIH0gZnJvbSAncHJpbWVuZy9kcm9wZG93bic7XHJcbmltcG9ydCB7IENoaXBNb2R1bGUgfSBmcm9tICdwcmltZW5nL2NoaXAnO1xyXG5pbXBvcnQgeyBDaGF0TWVzc2FnZSB9IGZyb20gJy4uL2NvcmUvbW9kZWxzL2NoYXQubW9kZWxzJztcclxuaW1wb3J0IHsgT3ZlcmxheVBhbmVsTW9kdWxlIH0gZnJvbSAncHJpbWVuZy9vdmVybGF5cGFuZWwnO1xyXG5pbXBvcnQgeyBPdmVybGF5UGFuZWwgfSBmcm9tICdwcmltZW5nL292ZXJsYXlwYW5lbCc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2FwcC1jaGF0LXdpbmRvdycsXHJcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcclxuICBpbXBvcnRzOiBbXHJcbiAgICBDb21tb25Nb2R1bGUsXHJcbiAgICBGb3Jtc01vZHVsZSxcclxuICAgIFRvYXN0TW9kdWxlLFxyXG4gICAgQnV0dG9uTW9kdWxlLFxyXG4gICAgQXZhdGFyTW9kdWxlLFxyXG4gICAgVG9vbHRpcE1vZHVsZSxcclxuICAgIElucHV0VGV4dGFyZWFNb2R1bGUsXHJcbiAgICBDaGlwTW9kdWxlLFxyXG4gICAgRHJvcGRvd25Nb2R1bGUsXHJcbiAgICBPdmVybGF5UGFuZWxNb2R1bGVcclxuICBdLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9jaGF0LXdpbmRvdy5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vY2hhdC13aW5kb3cuY29tcG9uZW50LnNjc3MnXSxcclxuICBwcm92aWRlcnM6IFtNZXNzYWdlU2VydmljZV1cclxufSlcclxuZXhwb3J0IGNsYXNzIENoYXRXaW5kb3dDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG4gIEBJbnB1dCgpIGNoYXRSb29tSWQhOiBzdHJpbmc7XHJcbiAgQElucHV0KCkgaGVhZGVyID0gJ0NoYXQnO1xyXG4gIEBJbnB1dCgpIG1ldGFkYXRhID0gJyc7XHJcbiAgQElucHV0KCkgY2hhdFVzZXJzID0gW107XHJcbiAgQElucHV0KCkgYWRkVXNlckFsbG93ZWQgPSB0cnVlO1xyXG4gIEBJbnB1dCgpIG1vZGU6ICdmbG9hdGluZycgfCAnZnVsbHNjcmVlbicgPSAnZmxvYXRpbmcnO1xyXG4gIEBJbnB1dCgpIHRoZW1lOiAnbGlnaHQnIHwgJ2RhcmsnID0gJ2xpZ2h0JztcclxuICBAT3V0cHV0KCkgb25BcmNoaXZlID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG5cclxuICByZWZyZXNoUm9vbSA9IGlucHV0PGJvb2xlYW4+KGZhbHNlKTtcclxuICAvLyBASW5wdXQoKSBjdXJyZW50VXNlcjogYW55O1xyXG5cclxuICBjaGF0U2VydmljZSA9IGluamVjdChDaGF0U2VydmljZSk7XHJcbiAgc29ja2V0ID0gaW5qZWN0KFNvY2tldFNlcnZpY2UpO1xyXG4gIG1lc3NhZ2VTZXJ2aWNlID0gaW5qZWN0KE1lc3NhZ2VTZXJ2aWNlKTtcclxuXHJcbiAgdXNlcnMgPSBzaWduYWw8YW55W10+KFtdKTtcclxuICBtZXNzYWdlcyA9IHNpZ25hbDxDaGF0TWVzc2FnZVtdPihbXSk7XHJcbiAgbmV3TWVzc2FnZSA9ICcnO1xyXG4gIG1pbmltaXplZCA9IGZhbHNlO1xyXG4gIGxvYWRpbmcgPSBmYWxzZTtcclxuICByZXBseVRvOiBDaGF0TWVzc2FnZSB8IG51bGwgPSBudWxsO1xyXG4gIHNlbGVjdGVkVXNlcjogYW55O1xyXG5cclxuICBAVmlld0NoaWxkKCdtZXNzYWdlc0NvbnRhaW5lcicpIG1lc3NhZ2VzQ29udGFpbmVyITogRWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD47XHJcbiAgQFZpZXdDaGlsZCgncmVhY3Rpb25PdmVybGF5JykgcmVhY3Rpb25PdmVybGF5ITogT3ZlcmxheVBhbmVsO1xyXG5cclxuICBwcml2YXRlIG9ic2VydmVyITogTXV0YXRpb25PYnNlcnZlcjtcclxuXHJcbiAgc2hvd1VzZXJzID0gZmFsc2U7XHJcbiAgc3VnZ2VzdGlvbiA9ICcnO1xyXG4gIGhvdmVyZWRSZWFjdGlvblVzZXJzOiBzdHJpbmdbXSA9IFtdO1xyXG5cclxuICBjb25zdHJ1Y3RvcigpIHtcclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgdGhpcy5zb2NrZXQuam9pblJvb20odGhpcy5jaGF0Um9vbUlkKTtcclxuICAgIHRoaXMuc29ja2V0LmpvaW5Vc2VyQ2hhbm5lbCh0aGlzLmNoYXRTZXJ2aWNlLmN1cnJlbnRVc2VyKCkudXNlcklkKTtcclxuICAgIHRoaXMubG9hZFVzZXJzKCk7XHJcbiAgICB0aGlzLmxvYWRNZXNzYWdlcygpO1xyXG4gICAgdGhpcy5saXN0ZW5Tb2NrZXQoKTtcclxuICB9XHJcblxyXG4gIGxvYWRVc2VycygpIHtcclxuICAgIHRoaXMuY2hhdFNlcnZpY2UuZ2V0Um9vbVVzZXJzKHRoaXMuY2hhdFJvb21JZCkuc3Vic2NyaWJlKHVzZXJzID0+IHtcclxuICAgICAgdGhpcy51c2Vycy5zZXQodXNlcnMpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBsb2FkTWVzc2FnZXMoKSB7XHJcbiAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xyXG4gICAgdGhpcy5jaGF0U2VydmljZS5nZXRNZXNzYWdlcyh0aGlzLmNoYXRSb29tSWQpLnN1YnNjcmliZSh7XHJcbiAgICAgIG5leHQ6IG1zZ3MgPT4ge1xyXG4gICAgICAgIHRoaXMubWVzc2FnZXMuc2V0KG1zZ3MpO1xyXG4gICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICB9LFxyXG4gICAgICBlcnJvcjogKCkgPT4gKHRoaXMubG9hZGluZyA9IGZhbHNlKVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBsaXN0ZW5Tb2NrZXQoKSB7XHJcbiAgICB0aGlzLnNvY2tldC5vbjxDaGF0TWVzc2FnZT4oJ25ld01lc3NhZ2UnKS5zdWJzY3JpYmUobXNnID0+IHtcclxuICAgICAgaWYgKG1zZy5jaGF0Um9vbUlkID09PSB0aGlzLmNoYXRSb29tSWQpIHtcclxuICAgICAgICB0aGlzLm1lc3NhZ2VzLnVwZGF0ZShsaXN0ID0+IFsuLi5saXN0LCBtc2ddKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gaWYgKG1zZy5zZW5kZXJJZCAhPT0gdGhpcy5jaGF0U2VydmljZS5jdXJyZW50VXNlcigpLnVzZXJJZCkge1xyXG4gICAgICAvLyAgIHRoaXMubWVzc2FnZVNlcnZpY2UuYWRkKHtcclxuICAgICAgLy8gICAgIHNldmVyaXR5OiAnaW5mbycsXHJcbiAgICAgIC8vICAgICBzdW1tYXJ5OiB0aGlzLmhlYWRlcixcclxuICAgICAgLy8gICAgIGRldGFpbDogbXNnLmNvbnRlbnQgPz8gJ05ldyBtZXNzYWdlJyxcclxuICAgICAgLy8gICAgIGxpZmU6IDI1MDBcclxuICAgICAgLy8gICB9KTtcclxuICAgICAgLy8gfVxyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5zb2NrZXQub24oJ3Jvb21Vc2VyQWRkZWQnKS5zdWJzY3JpYmUoKG1zZzogYW55KSA9PiB7XHJcbiAgICAgIGlmIChtc2cuY2hhdFJvb21JZCA9PT0gdGhpcy5jaGF0Um9vbUlkKSB7XHJcbiAgICAgICAgdGhpcy5sb2FkVXNlcnMoKTtcclxuICAgICAgICAvLyB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFkZCh7XHJcbiAgICAgICAgLy8gICBzZXZlcml0eTogJ2luZm8nLFxyXG4gICAgICAgIC8vICAgc3VtbWFyeTogJ1VzZXIgQWRkZWQnLFxyXG4gICAgICAgIC8vICAgZGV0YWlsOiBtc2cudXNlcj8udXNlck5hbWUsXHJcbiAgICAgICAgLy8gICBsaWZlOiAyNTAwXHJcbiAgICAgICAgLy8gfSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuc29ja2V0Lm9uKCdhZGRlZFRvUm9vbScpLnN1YnNjcmliZSgobXNnOiBhbnkpID0+IHtcclxuICAgICAgaWYgKG1zZy5jaGF0Um9vbUlkID09PSB0aGlzLmNoYXRSb29tSWQpIHtcclxuICAgICAgICB0aGlzLmxvYWRVc2VycygpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLnNvY2tldC5vbigndXNlckFscmVhZHlJblJvb20nKS5zdWJzY3JpYmUoKG1zZzogYW55KSA9PiB7XHJcbiAgICAgIC8vIGlmIChtc2cuY2hhdFJvb21JZCA9PT0gdGhpcy5jaGF0Um9vbUlkKSB7XHJcbiAgICAgIC8vICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoe1xyXG4gICAgICAvLyAgICAgc2V2ZXJpdHk6ICdpbmZvJyxcclxuICAgICAgLy8gICAgIHN1bW1hcnk6ICdVc2VyIEFscmVhZHkgQWRkZWQnLFxyXG4gICAgICAvLyAgICAgZGV0YWlsOiBtc2cudXNlcj8udXNlck5hbWUsXHJcbiAgICAgIC8vICAgICBsaWZlOiAyNTAwXHJcbiAgICAgIC8vICAgfSk7XHJcbiAgICAgIC8vIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgc2VuZCgpIHtcclxuICAgIGNvbnN0IGNvbnRlbnQgPSB0aGlzLm5ld01lc3NhZ2UudHJpbSgpO1xyXG4gICAgaWYgKCFjb250ZW50KSByZXR1cm47XHJcblxyXG4gICAgdGhpcy5jaGF0U2VydmljZVxyXG4gICAgICAuc2VuZE1lc3NhZ2UodGhpcy5jaGF0Um9vbUlkLCB7XHJcbiAgICAgICAgc2VuZGVySWQ6IHRoaXMuY2hhdFNlcnZpY2UuY3VycmVudFVzZXIoKS51c2VySWQsXHJcbiAgICAgICAgc2VuZGVyTmFtZTogdGhpcy5jaGF0U2VydmljZS5jdXJyZW50VXNlcigpLm5hbWUsXHJcbiAgICAgICAgY29udGVudCxcclxuICAgICAgICByZXBseVRvTWVzc2FnZUlkOiB0aGlzLnJlcGx5VG8/LnJlcGx5VG9NZXNzYWdlSWQgPz8gbnVsbCxcclxuICAgICAgICBjcmVhdGVkQnk6IHRoaXMuY2hhdFNlcnZpY2UuY3VycmVudFVzZXIoKS51c2VySWRcclxuICAgICAgfSlcclxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5uZXdNZXNzYWdlID0gJyc7XHJcbiAgICAgICAgdGhpcy5yZXBseVRvID0gbnVsbDtcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBhZGRVc2VyVG9Sb29tKCkge1xyXG4gICAgdGhpcy5jaGF0U2VydmljZVxyXG4gICAgICAuYWRkVXNlclRvUm9vbShcclxuICAgICAgICB0aGlzLmNoYXRSb29tSWQsXHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZFVzZXI/LnVzZXJfaWQsXHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZFVzZXI/LmZ1bGxfbmFtZSxcclxuICAgICAgICB0aGlzLmNoYXRTZXJ2aWNlLmN1cnJlbnRVc2VyKCkudXNlcklkKVxyXG4gICAgICAuc3Vic2NyaWJlKChyZXMpID0+IHtcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICB0b2dnbGVNaW5pbWl6ZSgpIHtcclxuICAgIHRoaXMubWluaW1pemVkID0gIXRoaXMubWluaW1pemVkO1xyXG4gIH1cclxuXHJcbiAgYXJjaGl2ZUNoYXQoKSB7XHJcbiAgICB0aGlzLmNoYXRTZXJ2aWNlLmFyY2hpdmVSb29tKHRoaXMuY2hhdFJvb21JZCkuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogKCkgPT4ge1xyXG4gICAgICAgIHRoaXMub25BcmNoaXZlLmVtaXQodGhpcy5jaGF0Um9vbUlkKTtcclxuICAgICAgfSxcclxuICAgICAgZXJyb3I6IGVyciA9PiBjb25zb2xlLmVycm9yKGVycilcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgc2V0UmVwbHkobXNnOiBDaGF0TWVzc2FnZSkge1xyXG4gICAgdGhpcy5yZXBseVRvID0gbXNnO1xyXG4gIH1cclxuXHJcbiAgY2xlYXJSZXBseSgpIHtcclxuICAgIHRoaXMucmVwbHlUbyA9IG51bGw7XHJcbiAgfVxyXG5cclxuICB0cmFja0J5SWQoaW5kZXg6IG51bWJlciwgbXNnOiBDaGF0TWVzc2FnZSkge1xyXG4gICAgcmV0dXJuIG1zZy5pZDtcclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCkge1xyXG4gICAgdGhpcy5zb2NrZXQub2ZmTmV3TWVzc2FnZSgpO1xyXG4gICAgdGhpcy5zb2NrZXQub2ZmTWVzc2FnZVNlZW4oKTtcclxuICAgIHRoaXMub2JzZXJ2ZXI/LmRpc2Nvbm5lY3QoKTtcclxuICB9XHJcblxyXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcclxuICAgIGNvbnN0IGVsID0gdGhpcy5tZXNzYWdlc0NvbnRhaW5lci5uYXRpdmVFbGVtZW50O1xyXG5cclxuICAgIHRoaXMub2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcigoKSA9PiB7XHJcbiAgICAgIC8vIPCflKUgU2Nyb2xsIEFGVEVSIERPTSBhY3R1YWxseSBjaGFuZ2VzXHJcbiAgICAgIGVsLnNjcm9sbFRvcCA9IGVsLnNjcm9sbEhlaWdodDtcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMub2JzZXJ2ZXIub2JzZXJ2ZShlbCwge1xyXG4gICAgICBjaGlsZExpc3Q6IHRydWUsXHJcbiAgICAgIHN1YnRyZWU6IHRydWUsXHJcbiAgICAgIGNoYXJhY3RlckRhdGE6IHRydWVcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgdG9nZ2xlVXNlcnMoKSB7XHJcbiAgICB0aGlzLnNob3dVc2VycyA9ICF0aGlzLnNob3dVc2VycztcclxuICB9XHJcbn1cclxuIiwiPHAtdG9hc3Q+PC9wLXRvYXN0PlxyXG5cclxuPGRpdiBjbGFzcz1cImNoYXQtd2luZG93XCIgW2NsYXNzLm1pbmltaXplZF09XCJtaW5pbWl6ZWRcIiBbY2xhc3MuZmxvYXRpbmddPVwibW9kZSA9PT0gJ2Zsb2F0aW5nJ1wiXHJcbiAgW2NsYXNzLmZ1bGxzY3JlZW5dPVwibW9kZSA9PT0gJ2Z1bGxzY3JlZW4nXCIgW2NsYXNzLmRhcmtdPVwidGhlbWUgPT09ICdkYXJrJ1wiPlxyXG4gIDxkaXYgY2xhc3M9XCJjaGF0LWhlYWRlclwiPlxyXG4gICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJ0aXRsZVwiPlxyXG4gICAgICAgIDxzcGFuPnt7IGhlYWRlciB9fTwvc3Bhbj5cclxuICAgICAgICA8c3BhbiAqbmdJZj1cInVzZXJzKCkubGVuZ3RoXCI+KHt7IHVzZXJzKCkubGVuZ3RoIH19IHt7IHVzZXJzKCkubGVuZ3RoID09IDEgPyAncGFydGljaXBhbnQnIDpcclxuICAgICAgICAgICdwYXJ0aWNpcGFudHMnfX0pPC9zcGFuPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdj5cclxuICAgICAgICA8c3Bhbj57eyBtZXRhZGF0YSB9fTwvc3Bhbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJoZWFkZXItYWN0aW9uc1wiPlxyXG4gICAgICA8YnV0dG9uIHBCdXR0b24gaWNvbj1cInBpIHBpLXVzZXJzXCIgKGNsaWNrKT1cInRvZ2dsZVVzZXJzKClcIiBzdHlsZT1cImZvbnQtc2l6ZTogMC41cmVtXCIgcFRvb2x0aXA9XCJUb29nbGUgVXNlcnNcIj48L2J1dHRvbj5cclxuICAgICAgPGJ1dHRvbiBwQnV0dG9uIFtpY29uXT1cIm1pbmltaXplZCA/ICdwaSBwaS1wbHVzJyA6ICdwaSBwaS1taW51cydcIiAoY2xpY2spPVwidG9nZ2xlTWluaW1pemUoKVwiIHN0eWxlPVwiZm9udC1zaXplOiAwLjVyZW1cIiBwVG9vbHRpcD1cIkhpZGUvU2hvd1wiPjwvYnV0dG9uPlxyXG4gICAgICA8YnV0dG9uIHBCdXR0b24gaWNvbj1cInBpIHBpLXRyYXNoXCIgKGNsaWNrKT1cImFyY2hpdmVDaGF0KClcIiBzdHlsZT1cImZvbnQtc2l6ZTogMC41cmVtXCIgcFRvb2x0aXA9XCJBcmNoaXZlXCI+PC9idXR0b24+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuXHJcbiAgPGRpdiBjbGFzcz1cImNoYXQtYm9keVwiICpuZ0lmPVwiIW1pbmltaXplZFwiPlxyXG4gICAgPGRpdiBjbGFzcz1cImNoYXQtbGF5b3V0XCIgW2NsYXNzLnVzZXJzLWhpZGRlbl09XCIhc2hvd1VzZXJzXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJjaGF0LW1haW5cIiBbY2xhc3MuZnVsbHNjcmVlbl09XCJtb2RlID09PSAnZnVsbHNjcmVlbidcIiBbY2xhc3MuZmxvYXRpbmddPVwibW9kZSA9PT0gJ2Zsb2F0aW5nJ1wiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJtZXNzYWdlc1wiICNtZXNzYWdlc0NvbnRhaW5lciBbY2xhc3MubG9hZGluZ109XCJsb2FkaW5nXCI+XHJcbiAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBtc2cgb2YgbWVzc2FnZXMoKTsgdHJhY2tCeTogdHJhY2tCeUlkXCIgY2xhc3M9XCJtZXNzYWdlLXJvd1wiXHJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgb3V0Z29pbmc6IG1zZy5zZW5kZXJJZCA9PT0gY2hhdFNlcnZpY2UuY3VycmVudFVzZXIoKS51c2VySWQsIGluY29taW5nOiBtc2cuc2VuZGVySWQgIT09IGNoYXRTZXJ2aWNlLmN1cnJlbnRVc2VyKCkudXNlcklkIH1cIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1lc3NhZ2UtYnViYmxlXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1lc3NhZ2UtbWV0YVwiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZW5kZXJcIj5cclxuICAgICAgICAgICAgICAgICAgPCEtLSAqbmdJZj1cIm1zZy5zZW5kZXJJZCAhPT0gY2hhdFNlcnZpY2UuY3VycmVudFVzZXIoKS51c2VySWRcIiAtLT5cclxuICAgICAgICAgICAgICAgICAge3sgbXNnLnNlbmRlck5hbWUgfX1cclxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwhLS0gPHNwYW4gY2xhc3M9XCJ0aW1lXCI+XHJcbiAgICAgICAgICAgICAgICAgIHt7IG1zZy5jcmVhdGVkQXQgfCBkYXRlOiAnc2hvcnRUaW1lJyB9fVxyXG4gICAgICAgICAgICAgICAgPC9zcGFuPiAtLT5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgPCEtLSBNRVNTQUdFIFRFWFQgLS0+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1lc3NhZ2UtY29udGVudFwiPlxyXG4gICAgICAgICAgICAgICAge3sgbXNnLmNvbnRlbnQgfX1cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtYXJlYVwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInJlcGx5LWJhbm5lclwiICpuZ0lmPVwicmVwbHlUb1wiPlxyXG4gICAgICAgICAgICA8c3Bhbj5SZXBseWluZyB0bzoge3sgcmVwbHlUby5jb250ZW50IHwgc2xpY2U6IDA6NTAgfX08L3NwYW4+XHJcbiAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiBpY29uPVwicGkgcGktdGltZXNcIiBjbGFzcz1cInAtYnV0dG9uLXRleHQgcC1idXR0b24tc21cIiAoY2xpY2spPVwiY2xlYXJSZXBseSgpXCI+PC9idXR0b24+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICA8dGV4dGFyZWEgcElucHV0VGV4dGFyZWEgWyhuZ01vZGVsKV09XCJuZXdNZXNzYWdlXCIgcm93cz1cIjJcIiBhdXRvUmVzaXplPVwidHJ1ZVwiIHBsYWNlaG9sZGVyPVwiVHlwZSBhIG1lc3NhZ2VcIlxyXG4gICAgICAgICAgICAoa2V5dXAuZW50ZXIpPVwic2VuZCgpXCI+XHJcbiAgICAgICAgICA8L3RleHRhcmVhPlxyXG5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1hY3Rpb25zXCI+XHJcbiAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiBpY29uPVwicGkgcGktc2VuZFwiIGxhYmVsPVwiU2VuZFwiIChjbGljayk9XCJzZW5kKClcIj48L2J1dHRvbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiBjbGFzcz1cImNoYXQtc2lkZWJhclwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzZWN0aW9uLXRpdGxlXCI+VXNlcnM8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwidXNlci1saXN0XCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidXNlci1yb3dcIiAqbmdGb3I9XCJsZXQgdSBvZiB1c2VycygpXCI+XHJcbiAgICAgICAgICAgIDxwLWF2YXRhciBbbGFiZWxdPVwidS51c2VybmFtZVswXVwiPjwvcC1hdmF0YXI+XHJcbiAgICAgICAgICAgIDxzcGFuPnt7IHUudXNlcm5hbWUgfX08L3NwYW4+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICBAaWYoYWRkVXNlckFsbG93ZWQpIHtcclxuICAgICAgICA8ZGl2IGNsYXNzPVwidXNlci1saXN0LWFkZFwiPlxyXG4gICAgICAgICAgPHAtZHJvcGRvd24gW29wdGlvbnNdPVwiY2hhdFNlcnZpY2UudXNlckxpc3QoKVwiIFsobmdNb2RlbCldPVwic2VsZWN0ZWRVc2VyXCIgb3B0aW9uTGFiZWw9XCJmdWxsX25hbWVcIlxyXG4gICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlbGVjdCBVc2VyXCIgLz5cclxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOiAyZW07XCI+XHJcbiAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiBpY29uPVwicGkgcGktcGx1c1wiIGxhYmVsPVwiQWRkXCIgKGNsaWNrKT1cImFkZFVzZXJUb1Jvb20oKVwiPjwvYnV0dG9uPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgfVxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG48L2Rpdj4iXX0=
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export {};
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhdC1jb25maWcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jaGF0LXdpZGdldC9zcmMvbGliL2NvcmUvY29uZmlnL2NoYXQtY29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBjaGF0LWNvbmZpZy50c1xyXG5leHBvcnQgaW50ZXJmYWNlIENoYXRDb25maWcge1xyXG4gIGFwaUJhc2VVcmw6IHN0cmluZztcclxuICB3c0Jhc2VVcmw6IHN0cmluZztcclxufVxyXG4iXX0=
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
// chat.tokens.ts
|
|
2
|
+
import { InjectionToken } from '@angular/core';
|
|
3
|
+
export const CHAT_CONFIG = new InjectionToken('CHAT_CONFIG');
|
|
4
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhdC50b2tlbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jaGF0LXdpZGdldC9zcmMvbGliL2NvcmUvY29uZmlnL2NoYXQudG9rZW5zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGlCQUFpQjtBQUNqQixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRy9DLE1BQU0sQ0FBQyxNQUFNLFdBQVcsR0FBRyxJQUFJLGNBQWMsQ0FBYSxhQUFhLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIGNoYXQudG9rZW5zLnRzXHJcbmltcG9ydCB7IEluamVjdGlvblRva2VuIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IENoYXRDb25maWcgfSBmcm9tICcuL2NoYXQtY29uZmlnJztcclxuXHJcbmV4cG9ydCBjb25zdCBDSEFUX0NPTkZJRyA9IG5ldyBJbmplY3Rpb25Ub2tlbjxDaGF0Q29uZmlnPignQ0hBVF9DT05GSUcnKTtcclxuIl19
|
|
@@ -1,15 +1,20 @@
|
|
|
1
|
-
import { Injectable, signal } from '@angular/core';
|
|
1
|
+
import { Inject, Injectable, signal } from '@angular/core';
|
|
2
2
|
import { map } from 'rxjs/operators';
|
|
3
|
+
import { CHAT_CONFIG } from "../config/chat.tokens";
|
|
3
4
|
import * as i0 from "@angular/core";
|
|
4
5
|
import * as i1 from "@angular/common/http";
|
|
5
6
|
export class ChatService {
|
|
6
|
-
constructor(http) {
|
|
7
|
+
constructor(http, config) {
|
|
7
8
|
this.http = http;
|
|
8
|
-
this.
|
|
9
|
+
this.config = config;
|
|
10
|
+
// private baseUrl = `https://coreuatarthkosh.sarjak.com`;
|
|
9
11
|
this.currentUser = signal(null);
|
|
10
12
|
this.userList = signal([]);
|
|
11
13
|
this.archiveRoomId = signal('');
|
|
12
14
|
}
|
|
15
|
+
get baseUrl() {
|
|
16
|
+
return this.config.apiBaseUrl;
|
|
17
|
+
}
|
|
13
18
|
/* ---------------- CHAT ROOMS ---------------- */
|
|
14
19
|
createRoom(roomId, name, metadata, createdBy, username, chatUsers) {
|
|
15
20
|
return this.http.post(`${this.baseUrl}/api/chat/chatrooms/create/${roomId}/`, {
|
|
@@ -71,11 +76,14 @@ export class ChatService {
|
|
|
71
76
|
archiveRoom(roomId) {
|
|
72
77
|
return this.http.delete(`${this.baseUrl}/api/chat/chatrooms/archive/${roomId}/`);
|
|
73
78
|
}
|
|
74
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ChatService, deps: [{ token: i1.HttpClient }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
79
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ChatService, deps: [{ token: i1.HttpClient }, { token: CHAT_CONFIG }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
75
80
|
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ChatService, providedIn: 'root' }); }
|
|
76
81
|
}
|
|
77
82
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ChatService, decorators: [{
|
|
78
83
|
type: Injectable,
|
|
79
84
|
args: [{ providedIn: 'root' }]
|
|
80
|
-
}], ctorParameters: () => [{ type: i1.HttpClient }
|
|
81
|
-
|
|
85
|
+
}], ctorParameters: () => [{ type: i1.HttpClient }, { type: undefined, decorators: [{
|
|
86
|
+
type: Inject,
|
|
87
|
+
args: [CHAT_CONFIG]
|
|
88
|
+
}] }] });
|
|
89
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhdC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2hhdC13aWRnZXQvc3JjL2xpYi9jb3JlL3NlcnZpY2VzL2NoYXQuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFFekQsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBR25DLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQzs7O0FBSWxELE1BQU0sT0FBTyxXQUFXO0lBT3BCLFlBQW9CLElBQWdCLEVBQStCLE1BQWtCO1FBQWpFLFNBQUksR0FBSixJQUFJLENBQVk7UUFBK0IsV0FBTSxHQUFOLE1BQU0sQ0FBWTtRQU5yRiwwREFBMEQ7UUFFMUQsZ0JBQVcsR0FBRyxNQUFNLENBQWEsSUFBSSxDQUFDLENBQUM7UUFDdkMsYUFBUSxHQUFHLE1BQU0sQ0FBUSxFQUFFLENBQUMsQ0FBQztRQUM3QixrQkFBYSxHQUFHLE1BQU0sQ0FBUyxFQUFFLENBQUMsQ0FBQztJQUduQyxDQUFDO0lBRUQsSUFBSSxPQUFPO1FBQ1AsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQztJQUNsQyxDQUFDO0lBRUQsa0RBQWtEO0lBQ2xELFVBQVUsQ0FBQyxNQUFjLEVBQUUsSUFBWSxFQUFFLFFBQWdCLEVBQUUsU0FBaUIsRUFBRSxRQUFnQixFQUFFLFNBQWM7UUFDMUcsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLDhCQUE4QixNQUFNLEdBQUcsRUFBRTtZQUMxRSxJQUFJO1lBQ0osUUFBUTtZQUNSLFNBQVM7WUFDVCxRQUFRO1lBQ1IsU0FBUztTQUNaLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRCxZQUFZLENBQUMsTUFBYztRQUN2QixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFRLEdBQUcsSUFBSSxDQUFDLE9BQU8sZ0NBQWdDLE1BQU0sU0FBUyxDQUFDLENBQUMsSUFBSSxDQUM1RixHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FDUCxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNYLEVBQUUsRUFBRSxDQUFDLENBQUMsTUFBTTtZQUNaLFFBQVEsRUFBRSxDQUFDLENBQUMsUUFBUTtTQUN2QixDQUFDLENBQUMsQ0FDTixDQUNKLENBQUM7SUFDTixDQUFDO0lBRUQsYUFBYSxDQUFDLE1BQWMsRUFBRSxNQUFjLEVBQUUsUUFBZ0IsRUFBRSxTQUFpQjtRQUM3RSxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sZ0NBQWdDLE1BQU0sYUFBYSxFQUFFO1lBQ3RGLE1BQU07WUFDTixRQUFRO1lBQ1IsU0FBUztTQUNaLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRCxnREFBZ0Q7SUFDaEQsV0FBVyxDQUFDLE1BQWMsRUFBRSxLQUFjO1FBQ3RDLE1BQU0sTUFBTSxHQUFRLEVBQUUsQ0FBQztRQUN2QixJQUFJLEtBQUs7WUFBRSxNQUFNLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUVoQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFRLEdBQUcsSUFBSSxDQUFDLE9BQU8seUNBQXlDLE1BQU0sR0FBRyxFQUFFLEVBQUMsTUFBTSxFQUFDLENBQUMsQ0FBQyxJQUFJLENBQ3pHLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUNQLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ1gsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFO1lBQ1IsVUFBVSxFQUFFLENBQUMsQ0FBQyxVQUFVO1lBQ3hCLFFBQVEsRUFBRSxDQUFDLENBQUMsUUFBUTtZQUNwQixVQUFVLEVBQUUsQ0FBQyxDQUFDLFVBQVU7WUFDeEIsT0FBTyxFQUFFLENBQUMsQ0FBQyxPQUFPO1lBQ2xCLGdCQUFnQixFQUFFLENBQUMsQ0FBQyxnQkFBZ0I7WUFDcEMsU0FBUyxFQUFFLENBQUMsQ0FBQyxTQUFTO1lBQ3RCLGFBQWEsRUFBRSxDQUFDLENBQUMsYUFBYSxJQUFJLEtBQUs7U0FDMUMsQ0FBQyxDQUFDLENBQ04sQ0FDSixDQUFDO0lBQ04sQ0FBQztJQUVELFdBQVcsQ0FDUCxNQUFjLEVBQ2QsT0FNQztRQUVELE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQU0sR0FBRyxJQUFJLENBQUMsT0FBTyxpQ0FBaUMsTUFBTSxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUMvRixHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ04sRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFO1lBQ1IsVUFBVSxFQUFFLENBQUMsQ0FBQyxVQUFVO1lBQ3hCLFFBQVEsRUFBRSxDQUFDLENBQUMsUUFBUTtZQUNwQixVQUFVLEVBQUUsQ0FBQyxDQUFDLFVBQVU7WUFDeEIsT0FBTyxFQUFFLENBQUMsQ0FBQyxPQUFPO1lBQ2xCLGdCQUFnQixFQUFFLENBQUMsQ0FBQyxnQkFBZ0I7WUFDcEMsU0FBUyxFQUFFLENBQUMsQ0FBQyxTQUFTO1lBQ3RCLGFBQWEsRUFBRSxDQUFDLENBQUMsYUFBYSxJQUFJLEtBQUs7U0FDMUMsQ0FBQyxDQUFDLENBQ04sQ0FBQztJQUNOLENBQUM7SUFFRCxRQUFRLENBQUMsY0FBc0IsRUFBRSxVQUFtQjtRQUNoRCxJQUFJLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxPQUFPLHVCQUF1QixjQUFjLEVBQUUsQ0FBQztRQUNqRSxJQUFJLFVBQVUsRUFBRSxDQUFDO1lBQ2IsR0FBRyxJQUFJLElBQUksVUFBVSxFQUFFLENBQUM7UUFDNUIsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQVEsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDO0lBQzNDLENBQUM7SUFHRCxXQUFXLENBQUMsTUFBYztRQUN0QixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFRLEdBQUcsSUFBSSxDQUFDLE9BQU8sK0JBQStCLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFDNUYsQ0FBQzsrR0FwR1EsV0FBVyw0Q0FPMEIsV0FBVzttSEFQaEQsV0FBVyxjQURDLE1BQU07OzRGQUNsQixXQUFXO2tCQUR2QixVQUFVO21CQUFDLEVBQUMsVUFBVSxFQUFFLE1BQU0sRUFBQzs7MEJBUVcsTUFBTTsyQkFBQyxXQUFXIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtJbmplY3QsIEluamVjdGFibGUsIHNpZ25hbH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7SHR0cENsaWVudH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xyXG5pbXBvcnQge21hcH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQge09ic2VydmFibGV9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQge0NoYXRNZXNzYWdlfSBmcm9tICcuLi9tb2RlbHMvY2hhdC5tb2RlbHMnO1xyXG5pbXBvcnQge0NIQVRfQ09ORklHfSBmcm9tIFwiLi4vY29uZmlnL2NoYXQudG9rZW5zXCI7XHJcbmltcG9ydCB7Q2hhdENvbmZpZ30gZnJvbSBcIi4uL2NvbmZpZy9jaGF0LWNvbmZpZ1wiO1xyXG5cclxuQEluamVjdGFibGUoe3Byb3ZpZGVkSW46ICdyb290J30pXHJcbmV4cG9ydCBjbGFzcyBDaGF0U2VydmljZSB7XHJcbiAgICAvLyBwcml2YXRlIGJhc2VVcmwgPSBgaHR0cHM6Ly9jb3JldWF0YXJ0aGtvc2guc2FyamFrLmNvbWA7XHJcblxyXG4gICAgY3VycmVudFVzZXIgPSBzaWduYWw8YW55IHwgbnVsbD4obnVsbCk7XHJcbiAgICB1c2VyTGlzdCA9IHNpZ25hbDxhbnlbXT4oW10pO1xyXG4gICAgYXJjaGl2ZVJvb21JZCA9IHNpZ25hbDxzdHJpbmc+KCcnKTtcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIGh0dHA6IEh0dHBDbGllbnQsIEBJbmplY3QoQ0hBVF9DT05GSUcpIHByaXZhdGUgY29uZmlnOiBDaGF0Q29uZmlnKSB7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGJhc2VVcmwoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY29uZmlnLmFwaUJhc2VVcmw7XHJcbiAgICB9XHJcblxyXG4gICAgLyogLS0tLS0tLS0tLS0tLS0tLSBDSEFUIFJPT01TIC0tLS0tLS0tLS0tLS0tLS0gKi9cclxuICAgIGNyZWF0ZVJvb20ocm9vbUlkOiBzdHJpbmcsIG5hbWU6IHN0cmluZywgbWV0YWRhdGE6IHN0cmluZywgY3JlYXRlZEJ5OiBzdHJpbmcsIHVzZXJuYW1lOiBzdHJpbmcsIGNoYXRVc2VyczogYW55KTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5odHRwLnBvc3QoYCR7dGhpcy5iYXNlVXJsfS9hcGkvY2hhdC9jaGF0cm9vbXMvY3JlYXRlLyR7cm9vbUlkfS9gLCB7XHJcbiAgICAgICAgICAgIG5hbWUsXHJcbiAgICAgICAgICAgIG1ldGFkYXRhLFxyXG4gICAgICAgICAgICBjcmVhdGVkQnksXHJcbiAgICAgICAgICAgIHVzZXJuYW1lLFxyXG4gICAgICAgICAgICBjaGF0VXNlcnNcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRSb29tVXNlcnMocm9vbUlkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPGFueVtdPiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8YW55W10+KGAke3RoaXMuYmFzZVVybH0vYXBpL2NoYXQvY2hhdHJvb21zL2dldF91c2VyLyR7cm9vbUlkfS91c2Vycy9gKS5waXBlKFxyXG4gICAgICAgICAgICBtYXAobGlzdCA9PlxyXG4gICAgICAgICAgICAgICAgbGlzdC5tYXAodSA9PiAoe1xyXG4gICAgICAgICAgICAgICAgICAgIGlkOiB1LlVzZXJJZCxcclxuICAgICAgICAgICAgICAgICAgICB1c2VybmFtZTogdS5Vc2VyTmFtZVxyXG4gICAgICAgICAgICAgICAgfSkpXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIGFkZFVzZXJUb1Jvb20ocm9vbUlkOiBzdHJpbmcsIHVzZXJJZDogc3RyaW5nLCB1c2VyTmFtZTogc3RyaW5nLCBjcmVhdGVkQnk6IHN0cmluZykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHAucG9zdChgJHt0aGlzLmJhc2VVcmx9L2FwaS9jaGF0L2NoYXRyb29tcy9hZGRfdXNlci8ke3Jvb21JZH0vdXNlcnMvYWRkL2AsIHtcclxuICAgICAgICAgICAgdXNlcklkLFxyXG4gICAgICAgICAgICB1c2VyTmFtZSxcclxuICAgICAgICAgICAgY3JlYXRlZEJ5XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyogLS0tLS0tLS0tLS0tLS0tLSBNRVNTQUdFUyAtLS0tLS0tLS0tLS0tLS0tICovXHJcbiAgICBnZXRNZXNzYWdlcyhyb29tSWQ6IHN0cmluZywgc2luY2U/OiBzdHJpbmcpOiBPYnNlcnZhYmxlPENoYXRNZXNzYWdlW10+IHtcclxuICAgICAgICBjb25zdCBwYXJhbXM6IGFueSA9IHt9O1xyXG4gICAgICAgIGlmIChzaW5jZSkgcGFyYW1zLnNpbmNlID0gc2luY2U7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PGFueVtdPihgJHt0aGlzLmJhc2VVcmx9L2FwaS9jaGF0L21lc3NhZ2VzL3Jvb21zL2FsbF9tZXNzYWdlcy8ke3Jvb21JZH0vYCwge3BhcmFtc30pLnBpcGUoXHJcbiAgICAgICAgICAgIG1hcChsaXN0ID0+XHJcbiAgICAgICAgICAgICAgICBsaXN0Lm1hcChtID0+ICh7XHJcbiAgICAgICAgICAgICAgICAgICAgaWQ6IG0uaWQsXHJcbiAgICAgICAgICAgICAgICAgICAgY2hhdFJvb21JZDogbS5jaGF0Um9vbUlkLFxyXG4gICAgICAgICAgICAgICAgICAgIHNlbmRlcklkOiBtLnNlbmRlcklkLFxyXG4gICAgICAgICAgICAgICAgICAgIHNlbmRlck5hbWU6IG0uc2VuZGVyTmFtZSxcclxuICAgICAgICAgICAgICAgICAgICBjb250ZW50OiBtLmNvbnRlbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgcmVwbHlUb01lc3NhZ2VJZDogbS5yZXBseVRvTWVzc2FnZUlkLFxyXG4gICAgICAgICAgICAgICAgICAgIGNyZWF0ZWRBdDogbS5jcmVhdGVkQXQsXHJcbiAgICAgICAgICAgICAgICAgICAgaGFzQXR0YWNobWVudDogbS5oYXNBdHRhY2htZW50ID8/IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgfSkpXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIHNlbmRNZXNzYWdlKFxyXG4gICAgICAgIHJvb21JZDogc3RyaW5nLFxyXG4gICAgICAgIHBheWxvYWQ6IHtcclxuICAgICAgICAgICAgc2VuZGVySWQ6IHN0cmluZztcclxuICAgICAgICAgICAgc2VuZGVyTmFtZTogc3RyaW5nLFxyXG4gICAgICAgICAgICBjb250ZW50OiBzdHJpbmc7XHJcbiAgICAgICAgICAgIHJlcGx5VG9NZXNzYWdlSWQ/OiBzdHJpbmcgfCBudWxsLFxyXG4gICAgICAgICAgICBjcmVhdGVkQnk6IHN0cmluZ1xyXG4gICAgICAgIH1cclxuICAgICk6IE9ic2VydmFibGU8Q2hhdE1lc3NhZ2U+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8YW55PihgJHt0aGlzLmJhc2VVcmx9L2FwaS9jaGF0L21lc3NhZ2VzL3Jvb21zL3NlbmQvJHtyb29tSWR9L2AsIHBheWxvYWQpLnBpcGUoXHJcbiAgICAgICAgICAgIG1hcChtID0+ICh7XHJcbiAgICAgICAgICAgICAgICBpZDogbS5pZCxcclxuICAgICAgICAgICAgICAgIGNoYXRSb29tSWQ6IG0uY2hhdFJvb21JZCxcclxuICAgICAgICAgICAgICAgIHNlbmRlcklkOiBtLnNlbmRlcklkLFxyXG4gICAgICAgICAgICAgICAgc2VuZGVyTmFtZTogbS5zZW5kZXJOYW1lLFxyXG4gICAgICAgICAgICAgICAgY29udGVudDogbS5jb250ZW50LFxyXG4gICAgICAgICAgICAgICAgcmVwbHlUb01lc3NhZ2VJZDogbS5yZXBseVRvTWVzc2FnZUlkLFxyXG4gICAgICAgICAgICAgICAgY3JlYXRlZEF0OiBtLmNyZWF0ZWRBdCxcclxuICAgICAgICAgICAgICAgIGhhc0F0dGFjaG1lbnQ6IG0uaGFzQXR0YWNobWVudCA/PyBmYWxzZSxcclxuICAgICAgICAgICAgfSkpXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRSb29tcyhsb2dnZWRJblVzZXJJZDogc3RyaW5nLCBjaGF0Um9vbUlkPzogc3RyaW5nKSB7XHJcbiAgICAgICAgbGV0IHVybCA9IGAke3RoaXMuYmFzZVVybH0vYXBpL2NoYXQvY2hhdHJvb21zLyR7bG9nZ2VkSW5Vc2VySWR9YDtcclxuICAgICAgICBpZiAoY2hhdFJvb21JZCkge1xyXG4gICAgICAgICAgICB1cmwgKz0gYC8ke2NoYXRSb29tSWR9YDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8YW55W10+KGAke3VybH0vYCk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIGFyY2hpdmVSb29tKHJvb21JZDogc3RyaW5nKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5kZWxldGU8YW55W10+KGAke3RoaXMuYmFzZVVybH0vYXBpL2NoYXQvY2hhdHJvb21zL2FyY2hpdmUvJHtyb29tSWR9L2ApO1xyXG4gICAgfVxyXG59XHJcbiJdfQ==
|
|
@@ -1,13 +1,16 @@
|
|
|
1
|
-
import { Injectable } from '@angular/core';
|
|
1
|
+
import { Inject, Injectable } from '@angular/core';
|
|
2
2
|
import { Observable } from 'rxjs';
|
|
3
|
+
import { CHAT_CONFIG } from "../config/chat.tokens";
|
|
3
4
|
import * as i0 from "@angular/core";
|
|
4
5
|
export class SocketService {
|
|
5
|
-
constructor() {
|
|
6
|
+
constructor(config) {
|
|
7
|
+
this.config = config;
|
|
6
8
|
this.listeners = new Map();
|
|
7
9
|
this.connect();
|
|
8
10
|
}
|
|
9
11
|
connect() {
|
|
10
|
-
this.socket = new WebSocket('wss://coreuatarthkosh.sarjak.com/ws/');
|
|
12
|
+
// this.socket = new WebSocket('wss://coreuatarthkosh.sarjak.com/ws/');
|
|
13
|
+
this.socket = new WebSocket(`${this.config.wsBaseUrl}/ws/`);
|
|
11
14
|
this.socket.onopen = () => {
|
|
12
15
|
console.log('[WS] Connected');
|
|
13
16
|
};
|
|
@@ -79,11 +82,14 @@ export class SocketService {
|
|
|
79
82
|
const arr = this.listeners.get(event) || [];
|
|
80
83
|
this.listeners.set(event, arr.filter(h => h !== cb));
|
|
81
84
|
}
|
|
82
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SocketService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
85
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SocketService, deps: [{ token: CHAT_CONFIG }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
83
86
|
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SocketService, providedIn: 'root' }); }
|
|
84
87
|
}
|
|
85
88
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SocketService, decorators: [{
|
|
86
89
|
type: Injectable,
|
|
87
90
|
args: [{ providedIn: 'root' }]
|
|
88
|
-
}], ctorParameters: () => [
|
|
89
|
-
|
|
91
|
+
}], ctorParameters: () => [{ type: undefined, decorators: [{
|
|
92
|
+
type: Inject,
|
|
93
|
+
args: [CHAT_CONFIG]
|
|
94
|
+
}] }] });
|
|
95
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29ja2V0LnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jaGF0LXdpZGdldC9zcmMvbGliL2NvcmUvc2VydmljZXMvc29ja2V0LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLE1BQU0sRUFBRSxVQUFVLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDakQsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUNoQyxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sdUJBQXVCLENBQUM7O0FBSWxELE1BQU0sT0FBTyxhQUFhO0lBS3RCLFlBQXlDLE1BQWtCO1FBQWxCLFdBQU0sR0FBTixNQUFNLENBQVk7UUFGbkQsY0FBUyxHQUFHLElBQUksR0FBRyxFQUFtQyxDQUFDO1FBRzNELElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUNuQixDQUFDO0lBRU8sT0FBTztRQUNYLHVFQUF1RTtRQUV2RSxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksU0FBUyxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLE1BQU0sQ0FBQyxDQUFDO1FBRTVELElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLEdBQUcsRUFBRTtZQUN0QixPQUFPLENBQUMsR0FBRyxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDbEMsQ0FBQyxDQUFDO1FBRUYsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEdBQUcsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUM5QixNQUFNLEdBQUcsR0FBUSxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN4QyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ3JELFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FB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RUFBRSxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUVPLFdBQVcsQ0FBQyxLQUFhLEVBQUUsRUFBdUI7UUFDdEQsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDN0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ2xDLENBQUM7UUFDRCxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUVPLGNBQWMsQ0FBQyxLQUFhLEVBQUUsRUFBd0I7UUFDMUQsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ04sSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDN0IsT0FBTztRQUNYLENBQUM7UUFDRCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDNUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN6RCxDQUFDOytHQXJHUSxhQUFhLGtCQUtGLFdBQVc7bUhBTHRCLGFBQWEsY0FERCxNQUFNOzs0RkFDbEIsYUFBYTtrQkFEekIsVUFBVTttQkFBQyxFQUFDLFVBQVUsRUFBRSxNQUFNLEVBQUM7OzBCQU1mLE1BQU07MkJBQUMsV0FBVyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7SW5qZWN0LCBJbmplY3RhYmxlfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHtPYnNlcnZhYmxlfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHtDSEFUX0NPTkZJR30gZnJvbSBcIi4uL2NvbmZpZy9jaGF0LnRva2Vuc1wiO1xyXG5pbXBvcnQge0NoYXRDb25maWd9IGZyb20gXCIuLi9jb25maWcvY2hhdC1jb25maWdcIjtcclxuXHJcbkBJbmplY3RhYmxlKHtwcm92aWRlZEluOiAncm9vdCd9KVxyXG5leHBvcnQgY2xhc3MgU29ja2V0U2VydmljZSB7XHJcblxyXG4gICAgcHJpdmF0ZSBzb2NrZXQhOiBXZWJTb2NrZXQ7XHJcbiAgICBwcml2YXRlIGxpc3RlbmVycyA9IG5ldyBNYXA8c3RyaW5nLCAoKGRhdGE6IGFueSkgPT4gdm9pZClbXT4oKTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihASW5qZWN0KENIQVRfQ09ORklHKSBwcml2YXRlIGNvbmZpZzogQ2hhdENvbmZpZykge1xyXG4gICAgICAgIHRoaXMuY29ubmVjdCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgY29ubmVjdCgpIHtcclxuICAgICAgICAvLyB0aGlzLnNvY2tldCA9IG5ldyBXZWJTb2NrZXQoJ3dzczovL2NvcmV1YXRhcnRoa29zaC5zYXJqYWsuY29tL3dzLycpO1xyXG5cclxuICAgICAgICB0aGlzLnNvY2tldCA9IG5ldyBXZWJTb2NrZXQoYCR7dGhpcy5jb25maWcud3NCYXNlVXJsfS93cy9gKTtcclxuXHJcbiAgICAgICAgdGhpcy5zb2NrZXQub25vcGVuID0gKCkgPT4ge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZygnW1dTXSBDb25uZWN0ZWQnKTtcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICB0aGlzLnNvY2tldC5vbm1lc3NhZ2UgPSAoZXZlbnQpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgbXNnOiBhbnkgPSBKU09OLnBhcnNlKGV2ZW50LmRhdGEpO1xyXG4gICAgICAgICAgICBjb25zdCBoYW5kbGVycyA9IHRoaXMubGlzdGVuZXJzLmdldChtc2cuZXZlbnQpIHx8IFtdO1xyXG4gICAgICAgICAgICBoYW5kbGVycy5mb3JFYWNoKGggPT4gaChtc2cuZGF0YSkpO1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHRoaXMuc29ja2V0Lm9uZXJyb3IgPSAoZXJyKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1tXU10gRXJyb3InLCBlcnIpO1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHRoaXMuc29ja2V0Lm9uY2xvc2UgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignW1dTXSBEaXNjb25uZWN0ZWQg4oCTIHJlY29ubmVjdGluZy4uLicpO1xyXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuY29ubmVjdCgpLCAyMDAwKTtcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIGVtaXQoZXZlbnQ6IHN0cmluZywgZGF0YT86IGFueSkge1xyXG4gICAgICAgIGNvbnN0IHBheWxvYWQ6IGFueSA9IHtldmVudCwgZGF0YX07XHJcbiAgICAgICAgdGhpcy5zb2NrZXQuc2VuZChKU09OLnN0cmluZ2lmeShwYXlsb2FkKSk7XHJcbiAgICB9XHJcblxyXG4gICAgam9pblJvb20ocm9vbUlkOiBzdHJpbmcpIHtcclxuICAgICAgICB0aGlzLmVtaXQoJ2pvaW5Sb29tJywgcm9vbUlkKTtcclxuICAgIH1cclxuXHJcbiAgICBqb2luVXNlckNoYW5uZWwodXNlcklkOiBzdHJpbmcpIHtcclxuICAgICAgICB0aGlzLmVtaXQoJ2pvaW5Vc2VyQ2hhbm5lbCcsIHVzZXJJZCk7XHJcbiAgICB9XHJcblxyXG4gICAgc2VuZE1lc3NhZ2UoZGF0YTogYW55KSB7XHJcbiAgICAgICAgdGhpcy5lbWl0KCdzZW5kTWVzc2FnZScsIGRhdGEpO1xyXG4gICAgfVxyXG5cclxuICAgIG1lc3NhZ2VTZWVuKGRhdGE6IHsgY2hhdFJvb21JZDogc3RyaW5nOyB1c2VySWQ6IHN0cmluZyB9KSB7XHJcbiAgICAgICAgdGhpcy5lbWl0KCdtZXNzYWdlU2VlbicsIGRhdGEpO1xyXG4gICAgfVxyXG5cclxuICAgIG9uPFQ+KGV2ZW50OiBzdHJpbmcpOiBPYnNlcnZhYmxlPFQ+IHtcclxuICAgICAgICByZXR1cm4gbmV3IE9ic2VydmFibGUoc3ViID0+IHtcclxuICAgICAgICAgICAgY29uc3QgaGFuZGxlciA9IChkYXRhOiBUKSA9PiBzdWIubmV4dChkYXRhKTtcclxuXHJcbiAgICAgICAgICAgIGlmICghdGhpcy5saXN0ZW5lcnMuaGFzKGV2ZW50KSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5saXN0ZW5lcnMuc2V0KGV2ZW50LCBbXSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5saXN0ZW5lcnMuZ2V0KGV2ZW50KSEucHVzaChoYW5kbGVyKTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBhcnIgPSB0aGlzLmxpc3RlbmVycy5nZXQoZXZlbnQpIHx8IFtdO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5saXN0ZW5lcnMuc2V0KGV2ZW50LCBhcnIuZmlsdGVyKGggPT4gaCAhPT0gaGFuZGxlcikpO1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIG9uTmV3TWVzc2FnZShjYjogKG1zZzogYW55KSA9PiB2b2lkKSB7XHJcbiAgICAgICAgdGhpcy5hZGRMaXN0ZW5lcignbmV3TWVzc2FnZScsIGNiKTtcclxuICAgIH1cclxuXHJcbiAgICBvZmZOZXdNZXNzYWdlKGNiPzogKG1zZzogYW55KSA9PiB2b2lkKSB7XHJcbiAgICAgICAgdGhpcy5yZW1vdmVMaXN0ZW5lcignbmV3TWVzc2FnZScsIGNiKTtcclxuICAgIH1cclxuXHJcbiAgICBvbk1lc3NhZ2VTZWVuKGNiOiAoZGF0YTogeyBjaGF0Um9vbUlkOiBzdHJpbmc7IHVzZXJJZDogc3RyaW5nIH0pID0+IHZvaWQpIHtcclxuICAgICAgICB0aGlzLmFkZExpc3RlbmVyKCdtZXNzYWdlU2VlbicsIGNiKTtcclxuICAgIH1cclxuXHJcbiAgICBvZmZNZXNzYWdlU2VlbihjYj86IChkYXRhOiBhbnkpID0+IHZvaWQpIHtcclxuICAgICAgICB0aGlzLnJlbW92ZUxpc3RlbmVyKCdtZXNzYWdlU2VlbicsIGNiKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGFkZExpc3RlbmVyKGV2ZW50OiBzdHJpbmcsIGNiOiAoZGF0YTogYW55KSA9PiB2b2lkKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmxpc3RlbmVycy5oYXMoZXZlbnQpKSB7XHJcbiAgICAgICAgICAgIHRoaXMubGlzdGVuZXJzLnNldChldmVudCwgW10pO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmxpc3RlbmVycy5nZXQoZXZlbnQpIS5wdXNoKGNiKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHJlbW92ZUxpc3RlbmVyKGV2ZW50OiBzdHJpbmcsIGNiPzogKGRhdGE6IGFueSkgPT4gdm9pZCkge1xyXG4gICAgICAgIGlmICghY2IpIHtcclxuICAgICAgICAgICAgdGhpcy5saXN0ZW5lcnMuZGVsZXRlKGV2ZW50KTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBhcnIgPSB0aGlzLmxpc3RlbmVycy5nZXQoZXZlbnQpIHx8IFtdO1xyXG4gICAgICAgIHRoaXMubGlzdGVuZXJzLnNldChldmVudCwgYXJyLmZpbHRlcihoID0+IGggIT09IGNiKSk7XHJcbiAgICB9XHJcbn1cclxuIl19
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
|
-
import { signal, Injectable, EventEmitter, input, inject, ViewChild, Output, Input, Component, effect, ViewEncapsulation, NgModule } from '@angular/core';
|
|
2
|
+
import { InjectionToken, signal, Inject, Injectable, EventEmitter, input, inject, ViewChild, Output, Input, Component, effect, ViewEncapsulation, NgModule } from '@angular/core';
|
|
3
3
|
import * as i1$1 from '@angular/common';
|
|
4
4
|
import { CommonModule } from '@angular/common';
|
|
5
5
|
import * as i2 from '@angular/forms';
|
|
@@ -15,10 +15,11 @@ import * as i4 from 'primeng/button';
|
|
|
15
15
|
import { ButtonModule } from 'primeng/button';
|
|
16
16
|
import * as i5 from 'primeng/avatar';
|
|
17
17
|
import { AvatarModule } from 'primeng/avatar';
|
|
18
|
+
import * as i6 from 'primeng/tooltip';
|
|
18
19
|
import { TooltipModule } from 'primeng/tooltip';
|
|
19
|
-
import * as
|
|
20
|
+
import * as i7 from 'primeng/inputtextarea';
|
|
20
21
|
import { InputTextareaModule } from 'primeng/inputtextarea';
|
|
21
|
-
import * as
|
|
22
|
+
import * as i8 from 'primeng/dropdown';
|
|
22
23
|
import { DropdownModule } from 'primeng/dropdown';
|
|
23
24
|
import { ChipModule } from 'primeng/chip';
|
|
24
25
|
import { OverlayPanelModule } from 'primeng/overlaypanel';
|
|
@@ -26,14 +27,21 @@ import * as i3$1 from 'primeng/tabview';
|
|
|
26
27
|
import { TabViewModule } from 'primeng/tabview';
|
|
27
28
|
import { trigger, transition, style, animate } from '@angular/animations';
|
|
28
29
|
|
|
30
|
+
// chat.tokens.ts
|
|
31
|
+
const CHAT_CONFIG = new InjectionToken('CHAT_CONFIG');
|
|
32
|
+
|
|
29
33
|
class ChatService {
|
|
30
|
-
constructor(http) {
|
|
34
|
+
constructor(http, config) {
|
|
31
35
|
this.http = http;
|
|
32
|
-
this.
|
|
36
|
+
this.config = config;
|
|
37
|
+
// private baseUrl = `https://coreuatarthkosh.sarjak.com`;
|
|
33
38
|
this.currentUser = signal(null);
|
|
34
39
|
this.userList = signal([]);
|
|
35
40
|
this.archiveRoomId = signal('');
|
|
36
41
|
}
|
|
42
|
+
get baseUrl() {
|
|
43
|
+
return this.config.apiBaseUrl;
|
|
44
|
+
}
|
|
37
45
|
/* ---------------- CHAT ROOMS ---------------- */
|
|
38
46
|
createRoom(roomId, name, metadata, createdBy, username, chatUsers) {
|
|
39
47
|
return this.http.post(`${this.baseUrl}/api/chat/chatrooms/create/${roomId}/`, {
|
|
@@ -95,21 +103,26 @@ class ChatService {
|
|
|
95
103
|
archiveRoom(roomId) {
|
|
96
104
|
return this.http.delete(`${this.baseUrl}/api/chat/chatrooms/archive/${roomId}/`);
|
|
97
105
|
}
|
|
98
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ChatService, deps: [{ token: i1.HttpClient }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
106
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ChatService, deps: [{ token: i1.HttpClient }, { token: CHAT_CONFIG }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
99
107
|
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ChatService, providedIn: 'root' }); }
|
|
100
108
|
}
|
|
101
109
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ChatService, decorators: [{
|
|
102
110
|
type: Injectable,
|
|
103
111
|
args: [{ providedIn: 'root' }]
|
|
104
|
-
}], ctorParameters: () => [{ type: i1.HttpClient }
|
|
112
|
+
}], ctorParameters: () => [{ type: i1.HttpClient }, { type: undefined, decorators: [{
|
|
113
|
+
type: Inject,
|
|
114
|
+
args: [CHAT_CONFIG]
|
|
115
|
+
}] }] });
|
|
105
116
|
|
|
106
117
|
class SocketService {
|
|
107
|
-
constructor() {
|
|
118
|
+
constructor(config) {
|
|
119
|
+
this.config = config;
|
|
108
120
|
this.listeners = new Map();
|
|
109
121
|
this.connect();
|
|
110
122
|
}
|
|
111
123
|
connect() {
|
|
112
|
-
this.socket = new WebSocket('wss://coreuatarthkosh.sarjak.com/ws/');
|
|
124
|
+
// this.socket = new WebSocket('wss://coreuatarthkosh.sarjak.com/ws/');
|
|
125
|
+
this.socket = new WebSocket(`${this.config.wsBaseUrl}/ws/`);
|
|
113
126
|
this.socket.onopen = () => {
|
|
114
127
|
console.log('[WS] Connected');
|
|
115
128
|
};
|
|
@@ -181,13 +194,16 @@ class SocketService {
|
|
|
181
194
|
const arr = this.listeners.get(event) || [];
|
|
182
195
|
this.listeners.set(event, arr.filter(h => h !== cb));
|
|
183
196
|
}
|
|
184
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SocketService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
197
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SocketService, deps: [{ token: CHAT_CONFIG }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
185
198
|
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SocketService, providedIn: 'root' }); }
|
|
186
199
|
}
|
|
187
200
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SocketService, decorators: [{
|
|
188
201
|
type: Injectable,
|
|
189
202
|
args: [{ providedIn: 'root' }]
|
|
190
|
-
}], ctorParameters: () => [
|
|
203
|
+
}], ctorParameters: () => [{ type: undefined, decorators: [{
|
|
204
|
+
type: Inject,
|
|
205
|
+
args: [CHAT_CONFIG]
|
|
206
|
+
}] }] });
|
|
191
207
|
|
|
192
208
|
class ChatWindowComponent {
|
|
193
209
|
constructor() {
|
|
@@ -340,7 +356,7 @@ class ChatWindowComponent {
|
|
|
340
356
|
this.showUsers = !this.showUsers;
|
|
341
357
|
}
|
|
342
358
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ChatWindowComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
343
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: ChatWindowComponent, isStandalone: true, selector: "app-chat-window", inputs: { chatRoomId: { classPropertyName: "chatRoomId", publicName: "chatRoomId", isSignal: false, isRequired: false, transformFunction: null }, header: { classPropertyName: "header", publicName: "header", isSignal: false, isRequired: false, transformFunction: null }, metadata: { classPropertyName: "metadata", publicName: "metadata", isSignal: false, isRequired: false, transformFunction: null }, chatUsers: { classPropertyName: "chatUsers", publicName: "chatUsers", isSignal: false, isRequired: false, transformFunction: null }, addUserAllowed: { classPropertyName: "addUserAllowed", publicName: "addUserAllowed", isSignal: false, isRequired: false, transformFunction: null }, mode: { classPropertyName: "mode", publicName: "mode", isSignal: false, isRequired: false, transformFunction: null }, theme: { classPropertyName: "theme", publicName: "theme", isSignal: false, isRequired: false, transformFunction: null }, refreshRoom: { classPropertyName: "refreshRoom", publicName: "refreshRoom", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { onArchive: "onArchive" }, providers: [MessageService], viewQueries: [{ propertyName: "messagesContainer", first: true, predicate: ["messagesContainer"], descendants: true }, { propertyName: "reactionOverlay", first: true, predicate: ["reactionOverlay"], descendants: true }], ngImport: i0, template: "<p-toast></p-toast>\r\n\r\n<div class=\"chat-window\" [class.minimized]=\"minimized\" [class.floating]=\"mode === 'floating'\"\r\n [class.fullscreen]=\"mode === 'fullscreen'\" [class.dark]=\"theme === 'dark'\">\r\n <div class=\"chat-header\">\r\n <div style=\"display: flex; flex-direction: column;\">\r\n <div class=\"title\">\r\n <span>{{ header }}</span>\r\n <span *ngIf=\"users().length\">({{ users().length }} {{ users().length == 1 ? 'participant' :\r\n 'participants'}})</span>\r\n </div>\r\n <div>\r\n <span>{{ metadata }}</span>\r\n </div>\r\n </div>\r\n <div class=\"header-actions\">\r\n <button pButton icon=\"pi pi-users\" (click)=\"toggleUsers()\" style=\"font-size: 0.5rem\"></button>\r\n <button pButton icon=\"pi pi-minus\" (click)=\"toggleMinimize()\" style=\"font-size: 0.5rem\"></button>\r\n <button pButton icon=\"pi pi-trash\" (click)=\"archiveChat()\" style=\"font-size: 0.5rem\"></button>\r\n </div>\r\n </div>\r\n\r\n <div class=\"chat-body\" *ngIf=\"!minimized\">\r\n <div class=\"chat-layout\" [class.users-hidden]=\"!showUsers\">\r\n <div class=\"chat-main\" [class.fullscreen]=\"mode === 'fullscreen'\" [class.floating]=\"mode === 'floating'\">\r\n <div class=\"messages\" #messagesContainer [class.loading]=\"loading\">\r\n <div *ngFor=\"let msg of messages(); trackBy: trackById\" class=\"message-row\"\r\n [ngClass]=\"{ outgoing: msg.senderId === chatService.currentUser().userId, incoming: msg.senderId !== chatService.currentUser().userId }\">\r\n <div class=\"message-bubble\">\r\n <div class=\"message-meta\">\r\n <span class=\"sender\">\r\n <!-- *ngIf=\"msg.senderId !== chatService.currentUser().userId\" -->\r\n {{ msg.senderName }}\r\n </span>\r\n <!-- <span class=\"time\">\r\n {{ msg.createdAt | date: 'shortTime' }}\r\n </span> -->\r\n </div>\r\n\r\n <!-- MESSAGE TEXT -->\r\n <div class=\"message-content\">\r\n {{ msg.content }}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"input-area\">\r\n <div class=\"reply-banner\" *ngIf=\"replyTo\">\r\n <span>Replying to: {{ replyTo.content | slice: 0:50 }}</span>\r\n <button pButton icon=\"pi pi-times\" class=\"p-button-text p-button-sm\" (click)=\"clearReply()\"></button>\r\n </div>\r\n\r\n <textarea pInputTextarea [(ngModel)]=\"newMessage\" rows=\"2\" autoResize=\"true\" placeholder=\"Type a message\"\r\n (keyup.enter)=\"send()\">\r\n </textarea>\r\n\r\n <div class=\"input-actions\">\r\n <button pButton icon=\"pi pi-send\" label=\"Send\" (click)=\"send()\"></button>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"chat-sidebar\">\r\n <div class=\"section-title\">Users</div>\r\n <div class=\"user-list\">\r\n <div class=\"user-row\" *ngFor=\"let u of users()\">\r\n <p-avatar [label]=\"u.username[0]\"></p-avatar>\r\n <span>{{ u.username }}</span>\r\n </div>\r\n </div>\r\n @if(addUserAllowed) {\r\n <div class=\"user-list-add\">\r\n <p-dropdown [options]=\"chatService.userList()\" [(ngModel)]=\"selectedUser\" optionLabel=\"full_name\"\r\n placeholder=\"Select User\" />\r\n <div style=\"margin-top: 2em;\">\r\n <button pButton icon=\"pi pi-plus\" label=\"Add\" (click)=\"addUserToRoom()\"></button>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n</div>", styles: [".chat-window{width:35vw;max-width:95vw;display:flex;flex-direction:column;background:#fff;border-radius:16px;box-shadow:0 8px 30px #0000001f;overflow:visible;font-size:14px;font-family:Inter,system-ui,sans-serif}.chat-window.minimized{height:auto}.chat-header{display:flex;align-items:center;justify-content:space-between;background:#4f6ef7;color:#fff;padding:10px 14px}.chat-header .title{display:flex;flex-direction:row;gap:6px}.chat-header .title span{font-weight:600;font-size:14px}.chat-header .title small{font-size:11px;opacity:.85}.chat-body{display:flex;flex:1;background:#f5f7fb}.chat-layout{display:flex;flex:1;width:100%;overflow:hidden}.chat-layout.users-hidden .chat-sidebar{transform:translate(100%);opacity:0;pointer-events:none;width:0!important}.chat-layout.users-hidden .chat-main{flex:1 1 100%}.chat-main{flex:1;display:flex;flex-direction:column;background:#f5f7fb;height:70vh}.messages{flex:1;padding:16px 14px;overflow-y:auto;scroll-behavior:smooth}.message-row{display:flex;margin-bottom:14px;animation:messageIn .25s ease-out;position:relative;overflow:visible;padding-top:28px}@keyframes messageIn{0%{opacity:0;transform:translateY(6px)}to{opacity:1;transform:translateY(0)}}.message-row.incoming{justify-content:flex-start}.message-row.incoming .reaction-bar{left:12px}.message-row.outgoing{justify-content:flex-end}.message-row.outgoing .reaction-bar{right:12px;left:auto}.message-bubble{position:relative;max-width:72%;padding:10px 14px;border-radius:16px;font-size:14px;line-height:1.45;word-break:break-word;overflow:visible}.message-row.incoming .message-bubble{background:#fff;color:#111;border-top-left-radius:6px;box-shadow:0 3px 10px #0000000f;overflow:visible}.message-bubble:after{content:\"\";position:absolute;bottom:-6px;right:8px}.message-row.incoming .message-bubble:after{content:\"\";position:absolute;left:-6px;top:12px;width:0;height:0;border-top:6px solid transparent;border-bottom:6px solid transparent;border-right:6px solid #ffffff}.message-row.outgoing .message-bubble{background:#4f6ef7;color:#fff;border-top-right-radius:6px;overflow:visible}.message-row.outgoing .message-bubble:after{content:\"\";position:absolute;right:-6px;top:12px;width:0;height:0;border-top:6px solid transparent;border-bottom:6px solid transparent;border-left:6px solid #4f6ef7}.message-meta{display:flex;justify-content:flex-end;font-size:10px;opacity:.6;margin-bottom:4px}.typing-indicator{display:inline-flex;align-items:center;gap:4px;padding:8px 12px;background:#fff;border-radius:14px;box-shadow:0 2px 6px #00000014}.typing-indicator span{width:6px;height:6px;background:#999;border-radius:50%;animation:typingDots 1.4s infinite ease-in-out both}.typing-indicator span:nth-child(1){animation-delay:0s}.typing-indicator span:nth-child(2){animation-delay:.2s}.typing-indicator span:nth-child(3){animation-delay:.4s}@keyframes typingDots{0%{transform:translateY(0);opacity:.4}50%{transform:translateY(-4px);opacity:1}to{transform:translateY(0);opacity:.4}}.input-area{background:#fff;padding:10px;border:1px solid #e5e7eb;display:flex;flex-direction:row;justify-content:space-between;gap:5px}.input-area textarea{max-height:60px;overflow:hidden;width:-webkit-fill-available}.reply-banner{background:#eef2ff;border-left:3px solid #4f6ef7;padding:6px 8px;font-size:12px;border-radius:8px;margin-bottom:6px;display:flex;justify-content:space-between}.input-actions{display:flex;justify-content:flex-end;margin-top:6px}.input-actions button{background:#4f6ef7;color:#fff;border-radius:999px;padding:0 16px}.chat-sidebar{background:#fff;border-left:1px solid #e5e7eb;box-shadow:-4px 0 10px #0000000d;display:flex;flex-direction:column}.section-title{font-weight:600;font-size:13px;padding:10px;border-bottom:1px solid #e5e7eb}.user-list{flex:1;overflow-y:auto;padding:8px;max-height:20em}.user-row{display:flex;align-items:center;gap:8px;padding:6px 8px;border-radius:8px}.user-row:hover{background:#f1f5f9}.user-list-add{padding:10px;border-top:1px solid #e5e7eb}.header-actions{display:flex;align-items:center;gap:6px}.header-actions .p-button{width:32px;height:32px;padding:0;border-radius:50%;background:#ffffff26}.header-actions .p-button:hover{background:#ffffff40}.chat-header{min-height:48px}.header-actions{flex-shrink:0}.header-actions .p-button{transition:background .2s ease,transform .1s ease}.header-actions .p-button:active{transform:scale(.92)}.reaction-bar{position:absolute;top:0;left:12px;transform:translateY(-100%);background:#fff;border-radius:20px;padding:4px 8px;display:none;box-shadow:0 2px 8px #0003;z-index:9999}.message-bubble:hover .reaction-bar{display:flex}.reaction-bar span{cursor:pointer;font-size:16px}.reaction-summary{margin-top:4px;display:flex;gap:6px}.reaction-chip{background:#f1f1f1;padding:2px 6px;border-radius:12px;font-size:12px;position:relative}.reaction-users-tooltip{position:absolute;bottom:130%;left:50%;transform:translate(-50%);white-space:nowrap;background:#222;color:#fff;padding:4px 8px;border-radius:6px;z-index:10000;bottom:calc(100% + 6px)}.message-row,.message-bubble,.reaction-summary{overflow:visible!important}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i1$1.SlicePipe, name: "slice" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: ToastModule }, { kind: "component", type: i3.Toast, selector: "p-toast", inputs: ["key", "autoZIndex", "baseZIndex", "life", "style", "styleClass", "position", "preventOpenDuplicates", "preventDuplicates", "showTransformOptions", "hideTransformOptions", "showTransitionOptions", "hideTransitionOptions", "breakpoints"], outputs: ["onClose"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "directive", type: i4.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading", "severity", "raised", "rounded", "text", "outlined", "size", "plain"] }, { kind: "ngmodule", type: AvatarModule }, { kind: "component", type: i5.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: "directive", type: i6.InputTextarea, selector: "[pInputTextarea]", inputs: ["autoResize", "variant"], outputs: ["onResize"] }, { kind: "ngmodule", type: ChipModule }, { kind: "ngmodule", type: DropdownModule }, { kind: "component", type: i7.Dropdown, selector: "p-dropdown", inputs: ["id", "scrollHeight", "filter", "name", "style", "panelStyle", "styleClass", "panelStyleClass", "readonly", "required", "editable", "appendTo", "tabindex", "placeholder", "loadingIcon", "filterPlaceholder", "filterLocale", "variant", "inputId", "dataKey", "filterBy", "filterFields", "autofocus", "resetFilterOnHide", "checkmark", "dropdownIcon", "loading", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "autoDisplayFirst", "group", "showClear", "emptyFilterMessage", "emptyMessage", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "ariaLabel", "ariaLabelledBy", "filterMatchMode", "maxlength", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "focusOnHover", "selectOnFocus", "autoOptionFocus", "autofocusFilter", "autoShowPanelOnPrintableCharacterKeyDown", "disabled", "itemSize", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "filterValue", "options"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onShow", "onHide", "onClear", "onLazyLoad"] }, { kind: "ngmodule", type: OverlayPanelModule }] }); }
|
|
359
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: ChatWindowComponent, isStandalone: true, selector: "app-chat-window", inputs: { chatRoomId: { classPropertyName: "chatRoomId", publicName: "chatRoomId", isSignal: false, isRequired: false, transformFunction: null }, header: { classPropertyName: "header", publicName: "header", isSignal: false, isRequired: false, transformFunction: null }, metadata: { classPropertyName: "metadata", publicName: "metadata", isSignal: false, isRequired: false, transformFunction: null }, chatUsers: { classPropertyName: "chatUsers", publicName: "chatUsers", isSignal: false, isRequired: false, transformFunction: null }, addUserAllowed: { classPropertyName: "addUserAllowed", publicName: "addUserAllowed", isSignal: false, isRequired: false, transformFunction: null }, mode: { classPropertyName: "mode", publicName: "mode", isSignal: false, isRequired: false, transformFunction: null }, theme: { classPropertyName: "theme", publicName: "theme", isSignal: false, isRequired: false, transformFunction: null }, refreshRoom: { classPropertyName: "refreshRoom", publicName: "refreshRoom", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { onArchive: "onArchive" }, providers: [MessageService], viewQueries: [{ propertyName: "messagesContainer", first: true, predicate: ["messagesContainer"], descendants: true }, { propertyName: "reactionOverlay", first: true, predicate: ["reactionOverlay"], descendants: true }], ngImport: i0, template: "<p-toast></p-toast>\r\n\r\n<div class=\"chat-window\" [class.minimized]=\"minimized\" [class.floating]=\"mode === 'floating'\"\r\n [class.fullscreen]=\"mode === 'fullscreen'\" [class.dark]=\"theme === 'dark'\">\r\n <div class=\"chat-header\">\r\n <div style=\"display: flex; flex-direction: column;\">\r\n <div class=\"title\">\r\n <span>{{ header }}</span>\r\n <span *ngIf=\"users().length\">({{ users().length }} {{ users().length == 1 ? 'participant' :\r\n 'participants'}})</span>\r\n </div>\r\n <div>\r\n <span>{{ metadata }}</span>\r\n </div>\r\n </div>\r\n <div class=\"header-actions\">\r\n <button pButton icon=\"pi pi-users\" (click)=\"toggleUsers()\" style=\"font-size: 0.5rem\" pTooltip=\"Toogle Users\"></button>\r\n <button pButton [icon]=\"minimized ? 'pi pi-plus' : 'pi pi-minus'\" (click)=\"toggleMinimize()\" style=\"font-size: 0.5rem\" pTooltip=\"Hide/Show\"></button>\r\n <button pButton icon=\"pi pi-trash\" (click)=\"archiveChat()\" style=\"font-size: 0.5rem\" pTooltip=\"Archive\"></button>\r\n </div>\r\n </div>\r\n\r\n <div class=\"chat-body\" *ngIf=\"!minimized\">\r\n <div class=\"chat-layout\" [class.users-hidden]=\"!showUsers\">\r\n <div class=\"chat-main\" [class.fullscreen]=\"mode === 'fullscreen'\" [class.floating]=\"mode === 'floating'\">\r\n <div class=\"messages\" #messagesContainer [class.loading]=\"loading\">\r\n <div *ngFor=\"let msg of messages(); trackBy: trackById\" class=\"message-row\"\r\n [ngClass]=\"{ outgoing: msg.senderId === chatService.currentUser().userId, incoming: msg.senderId !== chatService.currentUser().userId }\">\r\n <div class=\"message-bubble\">\r\n <div class=\"message-meta\">\r\n <span class=\"sender\">\r\n <!-- *ngIf=\"msg.senderId !== chatService.currentUser().userId\" -->\r\n {{ msg.senderName }}\r\n </span>\r\n <!-- <span class=\"time\">\r\n {{ msg.createdAt | date: 'shortTime' }}\r\n </span> -->\r\n </div>\r\n\r\n <!-- MESSAGE TEXT -->\r\n <div class=\"message-content\">\r\n {{ msg.content }}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"input-area\">\r\n <div class=\"reply-banner\" *ngIf=\"replyTo\">\r\n <span>Replying to: {{ replyTo.content | slice: 0:50 }}</span>\r\n <button pButton icon=\"pi pi-times\" class=\"p-button-text p-button-sm\" (click)=\"clearReply()\"></button>\r\n </div>\r\n\r\n <textarea pInputTextarea [(ngModel)]=\"newMessage\" rows=\"2\" autoResize=\"true\" placeholder=\"Type a message\"\r\n (keyup.enter)=\"send()\">\r\n </textarea>\r\n\r\n <div class=\"input-actions\">\r\n <button pButton icon=\"pi pi-send\" label=\"Send\" (click)=\"send()\"></button>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"chat-sidebar\">\r\n <div class=\"section-title\">Users</div>\r\n <div class=\"user-list\">\r\n <div class=\"user-row\" *ngFor=\"let u of users()\">\r\n <p-avatar [label]=\"u.username[0]\"></p-avatar>\r\n <span>{{ u.username }}</span>\r\n </div>\r\n </div>\r\n @if(addUserAllowed) {\r\n <div class=\"user-list-add\">\r\n <p-dropdown [options]=\"chatService.userList()\" [(ngModel)]=\"selectedUser\" optionLabel=\"full_name\"\r\n placeholder=\"Select User\" />\r\n <div style=\"margin-top: 2em;\">\r\n <button pButton icon=\"pi pi-plus\" label=\"Add\" (click)=\"addUserToRoom()\"></button>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n</div>", styles: [".chat-window{width:35vw;max-width:95vw;display:flex;flex-direction:column;background:#fff;border-radius:16px;box-shadow:0 8px 30px #0000001f;overflow:visible;font-size:14px;font-family:Inter,system-ui,sans-serif}.chat-window.minimized{height:auto}.chat-header{display:flex;align-items:center;justify-content:space-between;background:#4f6ef7;color:#fff;padding:10px 14px}.chat-header .title{display:flex;flex-direction:row;gap:6px}.chat-header .title span{font-weight:600;font-size:14px}.chat-header .title small{font-size:11px;opacity:.85}.chat-body{display:flex;flex:1;background:#f5f7fb}.chat-layout{display:flex;flex:1;width:100%;overflow:hidden}.chat-layout.users-hidden .chat-sidebar{transform:translate(100%);opacity:0;pointer-events:none;width:0!important}.chat-layout.users-hidden .chat-main{flex:1 1 100%}.chat-main{flex:1;display:flex;flex-direction:column;background:#f5f7fb;height:70vh}.messages{flex:1;padding:16px 14px;overflow-y:auto;scroll-behavior:smooth}.message-row{display:flex;margin-bottom:14px;animation:messageIn .25s ease-out;position:relative;overflow:visible;padding-top:28px}@keyframes messageIn{0%{opacity:0;transform:translateY(6px)}to{opacity:1;transform:translateY(0)}}.message-row.incoming{justify-content:flex-start}.message-row.incoming .reaction-bar{left:12px}.message-row.outgoing{justify-content:flex-end}.message-row.outgoing .reaction-bar{right:12px;left:auto}.message-bubble{position:relative;max-width:72%;padding:10px 14px;border-radius:16px;font-size:14px;line-height:1.45;word-break:break-word;overflow:visible}.message-row.incoming .message-bubble{background:#fff;color:#111;border-top-left-radius:6px;box-shadow:0 3px 10px #0000000f;overflow:visible}.message-bubble:after{content:\"\";position:absolute;bottom:-6px;right:8px}.message-row.incoming .message-bubble:after{content:\"\";position:absolute;left:-6px;top:12px;width:0;height:0;border-top:6px solid transparent;border-bottom:6px solid transparent;border-right:6px solid #ffffff}.message-row.outgoing .message-bubble{background:#4f6ef7;color:#fff;border-top-right-radius:6px;overflow:visible}.message-row.outgoing .message-bubble:after{content:\"\";position:absolute;right:-6px;top:12px;width:0;height:0;border-top:6px solid transparent;border-bottom:6px solid transparent;border-left:6px solid #4f6ef7}.message-meta{display:flex;justify-content:flex-end;font-size:10px;opacity:.6;margin-bottom:4px}.typing-indicator{display:inline-flex;align-items:center;gap:4px;padding:8px 12px;background:#fff;border-radius:14px;box-shadow:0 2px 6px #00000014}.typing-indicator span{width:6px;height:6px;background:#999;border-radius:50%;animation:typingDots 1.4s infinite ease-in-out both}.typing-indicator span:nth-child(1){animation-delay:0s}.typing-indicator span:nth-child(2){animation-delay:.2s}.typing-indicator span:nth-child(3){animation-delay:.4s}@keyframes typingDots{0%{transform:translateY(0);opacity:.4}50%{transform:translateY(-4px);opacity:1}to{transform:translateY(0);opacity:.4}}.input-area{background:#fff;padding:10px;border:1px solid #e5e7eb;display:flex;flex-direction:row;justify-content:space-between;gap:5px}.input-area textarea{max-height:60px;overflow:hidden;width:-webkit-fill-available}.reply-banner{background:#eef2ff;border-left:3px solid #4f6ef7;padding:6px 8px;font-size:12px;border-radius:8px;margin-bottom:6px;display:flex;justify-content:space-between}.input-actions{display:flex;justify-content:flex-end;margin-top:6px}.input-actions button{background:#4f6ef7;color:#fff;border-radius:999px;padding:0 16px}.chat-sidebar{background:#fff;border-left:1px solid #e5e7eb;box-shadow:-4px 0 10px #0000000d;display:flex;flex-direction:column}.section-title{font-weight:600;font-size:13px;padding:10px;border-bottom:1px solid #e5e7eb}.user-list{flex:1;overflow-y:auto;padding:8px;max-height:20em}.user-row{display:flex;align-items:center;gap:8px;padding:6px 8px;border-radius:8px}.user-row:hover{background:#f1f5f9}.user-list-add{padding:10px;border-top:1px solid #e5e7eb}.header-actions{display:flex;align-items:center;gap:6px}.header-actions .p-button{width:32px;height:32px;padding:0;border-radius:50%;background:#ffffff26}.header-actions .p-button:hover{background:#ffffff40}.chat-header{min-height:48px}.header-actions{flex-shrink:0}.header-actions .p-button{transition:background .2s ease,transform .1s ease}.header-actions .p-button:active{transform:scale(.92)}.reaction-bar{position:absolute;top:0;left:12px;transform:translateY(-100%);background:#fff;border-radius:20px;padding:4px 8px;display:none;box-shadow:0 2px 8px #0003;z-index:9999}.message-bubble:hover .reaction-bar{display:flex}.reaction-bar span{cursor:pointer;font-size:16px}.reaction-summary{margin-top:4px;display:flex;gap:6px}.reaction-chip{background:#f1f1f1;padding:2px 6px;border-radius:12px;font-size:12px;position:relative}.reaction-users-tooltip{position:absolute;bottom:130%;left:50%;transform:translate(-50%);white-space:nowrap;background:#222;color:#fff;padding:4px 8px;border-radius:6px;z-index:10000;bottom:calc(100% + 6px)}.message-row,.message-bubble,.reaction-summary{overflow:visible!important}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i1$1.SlicePipe, name: "slice" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: ToastModule }, { kind: "component", type: i3.Toast, selector: "p-toast", inputs: ["key", "autoZIndex", "baseZIndex", "life", "style", "styleClass", "position", "preventOpenDuplicates", "preventDuplicates", "showTransformOptions", "hideTransformOptions", "showTransitionOptions", "hideTransitionOptions", "breakpoints"], outputs: ["onClose"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "directive", type: i4.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading", "severity", "raised", "rounded", "text", "outlined", "size", "plain"] }, { kind: "ngmodule", type: AvatarModule }, { kind: "component", type: i5.Avatar, selector: "p-avatar", inputs: ["label", "icon", "image", "size", "shape", "style", "styleClass", "ariaLabel", "ariaLabelledBy"], outputs: ["onImageError"] }, { kind: "ngmodule", type: TooltipModule }, { kind: "directive", type: i6.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "pTooltip", "tooltipDisabled", "tooltipOptions"] }, { kind: "ngmodule", type: InputTextareaModule }, { kind: "directive", type: i7.InputTextarea, selector: "[pInputTextarea]", inputs: ["autoResize", "variant"], outputs: ["onResize"] }, { kind: "ngmodule", type: ChipModule }, { kind: "ngmodule", type: DropdownModule }, { kind: "component", type: i8.Dropdown, selector: "p-dropdown", inputs: ["id", "scrollHeight", "filter", "name", "style", "panelStyle", "styleClass", "panelStyleClass", "readonly", "required", "editable", "appendTo", "tabindex", "placeholder", "loadingIcon", "filterPlaceholder", "filterLocale", "variant", "inputId", "dataKey", "filterBy", "filterFields", "autofocus", "resetFilterOnHide", "checkmark", "dropdownIcon", "loading", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "autoDisplayFirst", "group", "showClear", "emptyFilterMessage", "emptyMessage", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "ariaLabel", "ariaLabelledBy", "filterMatchMode", "maxlength", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "focusOnHover", "selectOnFocus", "autoOptionFocus", "autofocusFilter", "autoShowPanelOnPrintableCharacterKeyDown", "disabled", "itemSize", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "filterValue", "options"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onShow", "onHide", "onClear", "onLazyLoad"] }, { kind: "ngmodule", type: OverlayPanelModule }] }); }
|
|
344
360
|
}
|
|
345
361
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ChatWindowComponent, decorators: [{
|
|
346
362
|
type: Component,
|
|
@@ -355,7 +371,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
355
371
|
ChipModule,
|
|
356
372
|
DropdownModule,
|
|
357
373
|
OverlayPanelModule
|
|
358
|
-
], providers: [MessageService], template: "<p-toast></p-toast>\r\n\r\n<div class=\"chat-window\" [class.minimized]=\"minimized\" [class.floating]=\"mode === 'floating'\"\r\n [class.fullscreen]=\"mode === 'fullscreen'\" [class.dark]=\"theme === 'dark'\">\r\n <div class=\"chat-header\">\r\n <div style=\"display: flex; flex-direction: column;\">\r\n <div class=\"title\">\r\n <span>{{ header }}</span>\r\n <span *ngIf=\"users().length\">({{ users().length }} {{ users().length == 1 ? 'participant' :\r\n 'participants'}})</span>\r\n </div>\r\n <div>\r\n <span>{{ metadata }}</span>\r\n </div>\r\n </div>\r\n <div class=\"header-actions\">\r\n <button pButton icon=\"pi pi-users\" (click)=\"toggleUsers()\" style=\"font-size: 0.5rem\"></button>\r\n <button pButton icon=\"pi pi-minus\" (click)=\"toggleMinimize()\" style=\"font-size: 0.5rem\"></button>\r\n <button pButton icon=\"pi pi-trash\" (click)=\"archiveChat()\" style=\"font-size: 0.5rem\"></button>\r\n </div>\r\n </div>\r\n\r\n <div class=\"chat-body\" *ngIf=\"!minimized\">\r\n <div class=\"chat-layout\" [class.users-hidden]=\"!showUsers\">\r\n <div class=\"chat-main\" [class.fullscreen]=\"mode === 'fullscreen'\" [class.floating]=\"mode === 'floating'\">\r\n <div class=\"messages\" #messagesContainer [class.loading]=\"loading\">\r\n <div *ngFor=\"let msg of messages(); trackBy: trackById\" class=\"message-row\"\r\n [ngClass]=\"{ outgoing: msg.senderId === chatService.currentUser().userId, incoming: msg.senderId !== chatService.currentUser().userId }\">\r\n <div class=\"message-bubble\">\r\n <div class=\"message-meta\">\r\n <span class=\"sender\">\r\n <!-- *ngIf=\"msg.senderId !== chatService.currentUser().userId\" -->\r\n {{ msg.senderName }}\r\n </span>\r\n <!-- <span class=\"time\">\r\n {{ msg.createdAt | date: 'shortTime' }}\r\n </span> -->\r\n </div>\r\n\r\n <!-- MESSAGE TEXT -->\r\n <div class=\"message-content\">\r\n {{ msg.content }}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"input-area\">\r\n <div class=\"reply-banner\" *ngIf=\"replyTo\">\r\n <span>Replying to: {{ replyTo.content | slice: 0:50 }}</span>\r\n <button pButton icon=\"pi pi-times\" class=\"p-button-text p-button-sm\" (click)=\"clearReply()\"></button>\r\n </div>\r\n\r\n <textarea pInputTextarea [(ngModel)]=\"newMessage\" rows=\"2\" autoResize=\"true\" placeholder=\"Type a message\"\r\n (keyup.enter)=\"send()\">\r\n </textarea>\r\n\r\n <div class=\"input-actions\">\r\n <button pButton icon=\"pi pi-send\" label=\"Send\" (click)=\"send()\"></button>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"chat-sidebar\">\r\n <div class=\"section-title\">Users</div>\r\n <div class=\"user-list\">\r\n <div class=\"user-row\" *ngFor=\"let u of users()\">\r\n <p-avatar [label]=\"u.username[0]\"></p-avatar>\r\n <span>{{ u.username }}</span>\r\n </div>\r\n </div>\r\n @if(addUserAllowed) {\r\n <div class=\"user-list-add\">\r\n <p-dropdown [options]=\"chatService.userList()\" [(ngModel)]=\"selectedUser\" optionLabel=\"full_name\"\r\n placeholder=\"Select User\" />\r\n <div style=\"margin-top: 2em;\">\r\n <button pButton icon=\"pi pi-plus\" label=\"Add\" (click)=\"addUserToRoom()\"></button>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n</div>", styles: [".chat-window{width:35vw;max-width:95vw;display:flex;flex-direction:column;background:#fff;border-radius:16px;box-shadow:0 8px 30px #0000001f;overflow:visible;font-size:14px;font-family:Inter,system-ui,sans-serif}.chat-window.minimized{height:auto}.chat-header{display:flex;align-items:center;justify-content:space-between;background:#4f6ef7;color:#fff;padding:10px 14px}.chat-header .title{display:flex;flex-direction:row;gap:6px}.chat-header .title span{font-weight:600;font-size:14px}.chat-header .title small{font-size:11px;opacity:.85}.chat-body{display:flex;flex:1;background:#f5f7fb}.chat-layout{display:flex;flex:1;width:100%;overflow:hidden}.chat-layout.users-hidden .chat-sidebar{transform:translate(100%);opacity:0;pointer-events:none;width:0!important}.chat-layout.users-hidden .chat-main{flex:1 1 100%}.chat-main{flex:1;display:flex;flex-direction:column;background:#f5f7fb;height:70vh}.messages{flex:1;padding:16px 14px;overflow-y:auto;scroll-behavior:smooth}.message-row{display:flex;margin-bottom:14px;animation:messageIn .25s ease-out;position:relative;overflow:visible;padding-top:28px}@keyframes messageIn{0%{opacity:0;transform:translateY(6px)}to{opacity:1;transform:translateY(0)}}.message-row.incoming{justify-content:flex-start}.message-row.incoming .reaction-bar{left:12px}.message-row.outgoing{justify-content:flex-end}.message-row.outgoing .reaction-bar{right:12px;left:auto}.message-bubble{position:relative;max-width:72%;padding:10px 14px;border-radius:16px;font-size:14px;line-height:1.45;word-break:break-word;overflow:visible}.message-row.incoming .message-bubble{background:#fff;color:#111;border-top-left-radius:6px;box-shadow:0 3px 10px #0000000f;overflow:visible}.message-bubble:after{content:\"\";position:absolute;bottom:-6px;right:8px}.message-row.incoming .message-bubble:after{content:\"\";position:absolute;left:-6px;top:12px;width:0;height:0;border-top:6px solid transparent;border-bottom:6px solid transparent;border-right:6px solid #ffffff}.message-row.outgoing .message-bubble{background:#4f6ef7;color:#fff;border-top-right-radius:6px;overflow:visible}.message-row.outgoing .message-bubble:after{content:\"\";position:absolute;right:-6px;top:12px;width:0;height:0;border-top:6px solid transparent;border-bottom:6px solid transparent;border-left:6px solid #4f6ef7}.message-meta{display:flex;justify-content:flex-end;font-size:10px;opacity:.6;margin-bottom:4px}.typing-indicator{display:inline-flex;align-items:center;gap:4px;padding:8px 12px;background:#fff;border-radius:14px;box-shadow:0 2px 6px #00000014}.typing-indicator span{width:6px;height:6px;background:#999;border-radius:50%;animation:typingDots 1.4s infinite ease-in-out both}.typing-indicator span:nth-child(1){animation-delay:0s}.typing-indicator span:nth-child(2){animation-delay:.2s}.typing-indicator span:nth-child(3){animation-delay:.4s}@keyframes typingDots{0%{transform:translateY(0);opacity:.4}50%{transform:translateY(-4px);opacity:1}to{transform:translateY(0);opacity:.4}}.input-area{background:#fff;padding:10px;border:1px solid #e5e7eb;display:flex;flex-direction:row;justify-content:space-between;gap:5px}.input-area textarea{max-height:60px;overflow:hidden;width:-webkit-fill-available}.reply-banner{background:#eef2ff;border-left:3px solid #4f6ef7;padding:6px 8px;font-size:12px;border-radius:8px;margin-bottom:6px;display:flex;justify-content:space-between}.input-actions{display:flex;justify-content:flex-end;margin-top:6px}.input-actions button{background:#4f6ef7;color:#fff;border-radius:999px;padding:0 16px}.chat-sidebar{background:#fff;border-left:1px solid #e5e7eb;box-shadow:-4px 0 10px #0000000d;display:flex;flex-direction:column}.section-title{font-weight:600;font-size:13px;padding:10px;border-bottom:1px solid #e5e7eb}.user-list{flex:1;overflow-y:auto;padding:8px;max-height:20em}.user-row{display:flex;align-items:center;gap:8px;padding:6px 8px;border-radius:8px}.user-row:hover{background:#f1f5f9}.user-list-add{padding:10px;border-top:1px solid #e5e7eb}.header-actions{display:flex;align-items:center;gap:6px}.header-actions .p-button{width:32px;height:32px;padding:0;border-radius:50%;background:#ffffff26}.header-actions .p-button:hover{background:#ffffff40}.chat-header{min-height:48px}.header-actions{flex-shrink:0}.header-actions .p-button{transition:background .2s ease,transform .1s ease}.header-actions .p-button:active{transform:scale(.92)}.reaction-bar{position:absolute;top:0;left:12px;transform:translateY(-100%);background:#fff;border-radius:20px;padding:4px 8px;display:none;box-shadow:0 2px 8px #0003;z-index:9999}.message-bubble:hover .reaction-bar{display:flex}.reaction-bar span{cursor:pointer;font-size:16px}.reaction-summary{margin-top:4px;display:flex;gap:6px}.reaction-chip{background:#f1f1f1;padding:2px 6px;border-radius:12px;font-size:12px;position:relative}.reaction-users-tooltip{position:absolute;bottom:130%;left:50%;transform:translate(-50%);white-space:nowrap;background:#222;color:#fff;padding:4px 8px;border-radius:6px;z-index:10000;bottom:calc(100% + 6px)}.message-row,.message-bubble,.reaction-summary{overflow:visible!important}\n"] }]
|
|
374
|
+
], providers: [MessageService], template: "<p-toast></p-toast>\r\n\r\n<div class=\"chat-window\" [class.minimized]=\"minimized\" [class.floating]=\"mode === 'floating'\"\r\n [class.fullscreen]=\"mode === 'fullscreen'\" [class.dark]=\"theme === 'dark'\">\r\n <div class=\"chat-header\">\r\n <div style=\"display: flex; flex-direction: column;\">\r\n <div class=\"title\">\r\n <span>{{ header }}</span>\r\n <span *ngIf=\"users().length\">({{ users().length }} {{ users().length == 1 ? 'participant' :\r\n 'participants'}})</span>\r\n </div>\r\n <div>\r\n <span>{{ metadata }}</span>\r\n </div>\r\n </div>\r\n <div class=\"header-actions\">\r\n <button pButton icon=\"pi pi-users\" (click)=\"toggleUsers()\" style=\"font-size: 0.5rem\" pTooltip=\"Toogle Users\"></button>\r\n <button pButton [icon]=\"minimized ? 'pi pi-plus' : 'pi pi-minus'\" (click)=\"toggleMinimize()\" style=\"font-size: 0.5rem\" pTooltip=\"Hide/Show\"></button>\r\n <button pButton icon=\"pi pi-trash\" (click)=\"archiveChat()\" style=\"font-size: 0.5rem\" pTooltip=\"Archive\"></button>\r\n </div>\r\n </div>\r\n\r\n <div class=\"chat-body\" *ngIf=\"!minimized\">\r\n <div class=\"chat-layout\" [class.users-hidden]=\"!showUsers\">\r\n <div class=\"chat-main\" [class.fullscreen]=\"mode === 'fullscreen'\" [class.floating]=\"mode === 'floating'\">\r\n <div class=\"messages\" #messagesContainer [class.loading]=\"loading\">\r\n <div *ngFor=\"let msg of messages(); trackBy: trackById\" class=\"message-row\"\r\n [ngClass]=\"{ outgoing: msg.senderId === chatService.currentUser().userId, incoming: msg.senderId !== chatService.currentUser().userId }\">\r\n <div class=\"message-bubble\">\r\n <div class=\"message-meta\">\r\n <span class=\"sender\">\r\n <!-- *ngIf=\"msg.senderId !== chatService.currentUser().userId\" -->\r\n {{ msg.senderName }}\r\n </span>\r\n <!-- <span class=\"time\">\r\n {{ msg.createdAt | date: 'shortTime' }}\r\n </span> -->\r\n </div>\r\n\r\n <!-- MESSAGE TEXT -->\r\n <div class=\"message-content\">\r\n {{ msg.content }}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"input-area\">\r\n <div class=\"reply-banner\" *ngIf=\"replyTo\">\r\n <span>Replying to: {{ replyTo.content | slice: 0:50 }}</span>\r\n <button pButton icon=\"pi pi-times\" class=\"p-button-text p-button-sm\" (click)=\"clearReply()\"></button>\r\n </div>\r\n\r\n <textarea pInputTextarea [(ngModel)]=\"newMessage\" rows=\"2\" autoResize=\"true\" placeholder=\"Type a message\"\r\n (keyup.enter)=\"send()\">\r\n </textarea>\r\n\r\n <div class=\"input-actions\">\r\n <button pButton icon=\"pi pi-send\" label=\"Send\" (click)=\"send()\"></button>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"chat-sidebar\">\r\n <div class=\"section-title\">Users</div>\r\n <div class=\"user-list\">\r\n <div class=\"user-row\" *ngFor=\"let u of users()\">\r\n <p-avatar [label]=\"u.username[0]\"></p-avatar>\r\n <span>{{ u.username }}</span>\r\n </div>\r\n </div>\r\n @if(addUserAllowed) {\r\n <div class=\"user-list-add\">\r\n <p-dropdown [options]=\"chatService.userList()\" [(ngModel)]=\"selectedUser\" optionLabel=\"full_name\"\r\n placeholder=\"Select User\" />\r\n <div style=\"margin-top: 2em;\">\r\n <button pButton icon=\"pi pi-plus\" label=\"Add\" (click)=\"addUserToRoom()\"></button>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n</div>", styles: [".chat-window{width:35vw;max-width:95vw;display:flex;flex-direction:column;background:#fff;border-radius:16px;box-shadow:0 8px 30px #0000001f;overflow:visible;font-size:14px;font-family:Inter,system-ui,sans-serif}.chat-window.minimized{height:auto}.chat-header{display:flex;align-items:center;justify-content:space-between;background:#4f6ef7;color:#fff;padding:10px 14px}.chat-header .title{display:flex;flex-direction:row;gap:6px}.chat-header .title span{font-weight:600;font-size:14px}.chat-header .title small{font-size:11px;opacity:.85}.chat-body{display:flex;flex:1;background:#f5f7fb}.chat-layout{display:flex;flex:1;width:100%;overflow:hidden}.chat-layout.users-hidden .chat-sidebar{transform:translate(100%);opacity:0;pointer-events:none;width:0!important}.chat-layout.users-hidden .chat-main{flex:1 1 100%}.chat-main{flex:1;display:flex;flex-direction:column;background:#f5f7fb;height:70vh}.messages{flex:1;padding:16px 14px;overflow-y:auto;scroll-behavior:smooth}.message-row{display:flex;margin-bottom:14px;animation:messageIn .25s ease-out;position:relative;overflow:visible;padding-top:28px}@keyframes messageIn{0%{opacity:0;transform:translateY(6px)}to{opacity:1;transform:translateY(0)}}.message-row.incoming{justify-content:flex-start}.message-row.incoming .reaction-bar{left:12px}.message-row.outgoing{justify-content:flex-end}.message-row.outgoing .reaction-bar{right:12px;left:auto}.message-bubble{position:relative;max-width:72%;padding:10px 14px;border-radius:16px;font-size:14px;line-height:1.45;word-break:break-word;overflow:visible}.message-row.incoming .message-bubble{background:#fff;color:#111;border-top-left-radius:6px;box-shadow:0 3px 10px #0000000f;overflow:visible}.message-bubble:after{content:\"\";position:absolute;bottom:-6px;right:8px}.message-row.incoming .message-bubble:after{content:\"\";position:absolute;left:-6px;top:12px;width:0;height:0;border-top:6px solid transparent;border-bottom:6px solid transparent;border-right:6px solid #ffffff}.message-row.outgoing .message-bubble{background:#4f6ef7;color:#fff;border-top-right-radius:6px;overflow:visible}.message-row.outgoing .message-bubble:after{content:\"\";position:absolute;right:-6px;top:12px;width:0;height:0;border-top:6px solid transparent;border-bottom:6px solid transparent;border-left:6px solid #4f6ef7}.message-meta{display:flex;justify-content:flex-end;font-size:10px;opacity:.6;margin-bottom:4px}.typing-indicator{display:inline-flex;align-items:center;gap:4px;padding:8px 12px;background:#fff;border-radius:14px;box-shadow:0 2px 6px #00000014}.typing-indicator span{width:6px;height:6px;background:#999;border-radius:50%;animation:typingDots 1.4s infinite ease-in-out both}.typing-indicator span:nth-child(1){animation-delay:0s}.typing-indicator span:nth-child(2){animation-delay:.2s}.typing-indicator span:nth-child(3){animation-delay:.4s}@keyframes typingDots{0%{transform:translateY(0);opacity:.4}50%{transform:translateY(-4px);opacity:1}to{transform:translateY(0);opacity:.4}}.input-area{background:#fff;padding:10px;border:1px solid #e5e7eb;display:flex;flex-direction:row;justify-content:space-between;gap:5px}.input-area textarea{max-height:60px;overflow:hidden;width:-webkit-fill-available}.reply-banner{background:#eef2ff;border-left:3px solid #4f6ef7;padding:6px 8px;font-size:12px;border-radius:8px;margin-bottom:6px;display:flex;justify-content:space-between}.input-actions{display:flex;justify-content:flex-end;margin-top:6px}.input-actions button{background:#4f6ef7;color:#fff;border-radius:999px;padding:0 16px}.chat-sidebar{background:#fff;border-left:1px solid #e5e7eb;box-shadow:-4px 0 10px #0000000d;display:flex;flex-direction:column}.section-title{font-weight:600;font-size:13px;padding:10px;border-bottom:1px solid #e5e7eb}.user-list{flex:1;overflow-y:auto;padding:8px;max-height:20em}.user-row{display:flex;align-items:center;gap:8px;padding:6px 8px;border-radius:8px}.user-row:hover{background:#f1f5f9}.user-list-add{padding:10px;border-top:1px solid #e5e7eb}.header-actions{display:flex;align-items:center;gap:6px}.header-actions .p-button{width:32px;height:32px;padding:0;border-radius:50%;background:#ffffff26}.header-actions .p-button:hover{background:#ffffff40}.chat-header{min-height:48px}.header-actions{flex-shrink:0}.header-actions .p-button{transition:background .2s ease,transform .1s ease}.header-actions .p-button:active{transform:scale(.92)}.reaction-bar{position:absolute;top:0;left:12px;transform:translateY(-100%);background:#fff;border-radius:20px;padding:4px 8px;display:none;box-shadow:0 2px 8px #0003;z-index:9999}.message-bubble:hover .reaction-bar{display:flex}.reaction-bar span{cursor:pointer;font-size:16px}.reaction-summary{margin-top:4px;display:flex;gap:6px}.reaction-chip{background:#f1f1f1;padding:2px 6px;border-radius:12px;font-size:12px;position:relative}.reaction-users-tooltip{position:absolute;bottom:130%;left:50%;transform:translate(-50%);white-space:nowrap;background:#222;color:#fff;padding:4px 8px;border-radius:6px;z-index:10000;bottom:calc(100% + 6px)}.message-row,.message-bubble,.reaction-summary{overflow:visible!important}\n"] }]
|
|
359
375
|
}], ctorParameters: () => [], propDecorators: { chatRoomId: [{
|
|
360
376
|
type: Input
|
|
361
377
|
}], header: [{
|
|
@@ -557,6 +573,17 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
557
573
|
}] } });
|
|
558
574
|
|
|
559
575
|
class ChatWidgetModule {
|
|
576
|
+
static forRoot(config) {
|
|
577
|
+
return {
|
|
578
|
+
ngModule: ChatWidgetModule,
|
|
579
|
+
providers: [
|
|
580
|
+
{
|
|
581
|
+
provide: CHAT_CONFIG,
|
|
582
|
+
useValue: config
|
|
583
|
+
}
|
|
584
|
+
]
|
|
585
|
+
};
|
|
586
|
+
}
|
|
560
587
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ChatWidgetModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
|
|
561
588
|
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "17.3.12", ngImport: i0, type: ChatWidgetModule, imports: [CommonModule,
|
|
562
589
|
ChatLauncherComponent,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"arthakosh-chat-widget.mjs","sources":["../../../projects/chat-widget/src/lib/core/services/chat.service.ts","../../../projects/chat-widget/src/lib/core/services/socket.service.ts","../../../projects/chat-widget/src/lib/chat-window/chat-window.component.ts","../../../projects/chat-widget/src/lib/chat-window/chat-window.component.html","../../../projects/chat-widget/src/lib/chat-launcher/chat-launcher.component.ts","../../../projects/chat-widget/src/lib/chat-launcher/chat-launcher.component.html","../../../projects/chat-widget/src/lib/all-chats/all-chats.component.ts","../../../projects/chat-widget/src/lib/all-chats/all-chats.component.html","../../../projects/chat-widget/src/lib/chat-widget.module.ts","../../../projects/chat-widget/src/public-api.ts","../../../projects/chat-widget/src/arthakosh-chat-widget.ts"],"sourcesContent":["import { Injectable, input, signal } from '@angular/core';\r\nimport { HttpClient } from '@angular/common/http';\r\nimport { map } from 'rxjs/operators';\r\nimport { Observable } from 'rxjs';\r\nimport { ChatMessage, Reaction } from '../models/chat.models';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class ChatService {\r\n private baseUrl = `https://coreuatarthkosh.sarjak.com`;\r\n\r\n currentUser = signal<any | null>(null);\r\n userList = signal<any[]>([]);\r\n archiveRoomId = signal<string>('');\r\n\r\n constructor(private http: HttpClient) { }\r\n\r\n /* ---------------- CHAT ROOMS ---------------- */\r\n createRoom(roomId: string, name: string, metadata: string, createdBy: string, username: string, chatUsers: any): Observable<any> {\r\n return this.http.post(`${this.baseUrl}/api/chat/chatrooms/create/${roomId}/`, {\r\n name,\r\n metadata,\r\n createdBy,\r\n username,\r\n chatUsers\r\n });\r\n }\r\n\r\n getRoomUsers(roomId: string): Observable<any[]> {\r\n return this.http.get<any[]>(`${this.baseUrl}/api/chat/chatrooms/get_user/${roomId}/users/`).pipe(\r\n map(list =>\r\n list.map(u => ({\r\n id: u.UserId,\r\n username: u.UserName\r\n }))\r\n )\r\n );\r\n }\r\n\r\n addUserToRoom(roomId: string, userId: string, userName: string, createdBy: string) {\r\n return this.http.post(`${this.baseUrl}/api/chat/chatrooms/add_user/${roomId}/users/add/`, {\r\n userId,\r\n userName,\r\n createdBy\r\n });\r\n }\r\n\r\n /* ---------------- MESSAGES ---------------- */\r\n getMessages(roomId: string, since?: string): Observable<ChatMessage[]> {\r\n const params: any = {};\r\n if (since) params.since = since;\r\n\r\n return this.http.get<any[]>(`${this.baseUrl}/api/chat/messages/rooms/all_messages/${roomId}/`, { params }).pipe(\r\n map(list =>\r\n list.map(m => ({\r\n id: m.id,\r\n chatRoomId: m.chatRoomId,\r\n senderId: m.senderId,\r\n senderName: m.senderName,\r\n content: m.content,\r\n replyToMessageId: m.replyToMessageId,\r\n createdAt: m.createdAt,\r\n hasAttachment: m.hasAttachment ?? false,\r\n }))\r\n )\r\n );\r\n }\r\n\r\n sendMessage(\r\n roomId: string,\r\n payload: { senderId: string; senderName: string, content: string; replyToMessageId?: string | null, createdBy: string }\r\n ): Observable<ChatMessage> {\r\n return this.http.post<any>(`${this.baseUrl}/api/chat/messages/rooms/send/${roomId}/`, payload).pipe(\r\n map(m => ({\r\n id: m.id,\r\n chatRoomId: m.chatRoomId,\r\n senderId: m.senderId,\r\n senderName: m.senderName,\r\n content: m.content,\r\n replyToMessageId: m.replyToMessageId,\r\n createdAt: m.createdAt,\r\n hasAttachment: m.hasAttachment ?? false,\r\n }))\r\n );\r\n }\r\n\r\n getRooms(loggedInUserId: string, chatRoomId?: string) {\r\n let url = `${this.baseUrl}/api/chat/chatrooms/${loggedInUserId}`;\r\n if (chatRoomId) {\r\n url += `/${chatRoomId}`;\r\n }\r\n return this.http.get<any[]>(`${url}/`);\r\n }\r\n\r\n\r\n archiveRoom(roomId: string) {\r\n return this.http.delete<any[]>(`${this.baseUrl}/api/chat/chatrooms/archive/${roomId}/`);\r\n }\r\n}\r\n","import { Injectable, signal } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class SocketService {\r\n\r\n private socket!: WebSocket;\r\n private listeners = new Map<string, ((data: any) => void)[]>();\r\n\r\n constructor() {\r\n this.connect();\r\n }\r\n\r\n private connect() {\r\n this.socket = new WebSocket('wss://coreuatarthkosh.sarjak.com/ws/');\r\n\r\n this.socket.onopen = () => {\r\n console.log('[WS] Connected');\r\n };\r\n\r\n this.socket.onmessage = (event) => {\r\n const msg: any = JSON.parse(event.data);\r\n const handlers = this.listeners.get(msg.event) || [];\r\n handlers.forEach(h => h(msg.data));\r\n };\r\n\r\n this.socket.onerror = (err) => {\r\n console.error('[WS] Error', err);\r\n };\r\n\r\n this.socket.onclose = () => {\r\n console.warn('[WS] Disconnected – reconnecting...');\r\n setTimeout(() => this.connect(), 2000);\r\n };\r\n }\r\n\r\n emit(event: string, data?: any) {\r\n const payload: any = { event, data };\r\n this.socket.send(JSON.stringify(payload));\r\n }\r\n\r\n joinRoom(roomId: string) {\r\n this.emit('joinRoom', roomId);\r\n }\r\n\r\n joinUserChannel(userId: string) {\r\n this.emit('joinUserChannel', userId);\r\n }\r\n\r\n sendMessage(data: any) {\r\n this.emit('sendMessage', data);\r\n }\r\n\r\n messageSeen(data: { chatRoomId: string; userId: string }) {\r\n this.emit('messageSeen', data);\r\n }\r\n\r\n on<T>(event: string): Observable<T> {\r\n return new Observable(sub => {\r\n const handler = (data: T) => sub.next(data);\r\n\r\n if (!this.listeners.has(event)) {\r\n this.listeners.set(event, []);\r\n }\r\n this.listeners.get(event)!.push(handler);\r\n\r\n return () => {\r\n const arr = this.listeners.get(event) || [];\r\n this.listeners.set(event, arr.filter(h => h !== handler));\r\n };\r\n });\r\n }\r\n\r\n onNewMessage(cb: (msg: any) => void) {\r\n this.addListener('newMessage', cb);\r\n }\r\n\r\n offNewMessage(cb?: (msg: any) => void) {\r\n this.removeListener('newMessage', cb);\r\n }\r\n\r\n onMessageSeen(cb: (data: { chatRoomId: string; userId: string }) => void) {\r\n this.addListener('messageSeen', cb);\r\n }\r\n\r\n offMessageSeen(cb?: (data: any) => void) {\r\n this.removeListener('messageSeen', cb);\r\n }\r\n\r\n private addListener(event: string, cb: (data: any) => void) {\r\n if (!this.listeners.has(event)) {\r\n this.listeners.set(event, []);\r\n }\r\n this.listeners.get(event)!.push(cb);\r\n }\r\n\r\n private removeListener(event: string, cb?: (data: any) => void) {\r\n if (!cb) {\r\n this.listeners.delete(event);\r\n return;\r\n }\r\n const arr = this.listeners.get(event) || [];\r\n this.listeners.set(event, arr.filter(h => h !== cb));\r\n }\r\n}\r\n","import { Component, ElementRef, EventEmitter, Input, OnInit, Output, SimpleChanges, ViewChild, effect, inject, input, signal } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { ChatService } from '../core/services/chat.service';\r\nimport { SocketService } from '../core/services/socket.service';\r\nimport { ToastModule } from 'primeng/toast';\r\nimport { MessageService } from 'primeng/api';\r\nimport { ButtonModule } from 'primeng/button';\r\nimport { AvatarModule } from 'primeng/avatar';\r\nimport { TooltipModule } from 'primeng/tooltip';\r\nimport { InputTextareaModule } from 'primeng/inputtextarea';\r\nimport { DropdownModule } from 'primeng/dropdown';\r\nimport { ChipModule } from 'primeng/chip';\r\nimport { ChatMessage } from '../core/models/chat.models';\r\nimport { OverlayPanelModule } from 'primeng/overlaypanel';\r\nimport { OverlayPanel } from 'primeng/overlaypanel';\r\n\r\n@Component({\r\n selector: 'app-chat-window',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n ToastModule,\r\n ButtonModule,\r\n AvatarModule,\r\n TooltipModule,\r\n InputTextareaModule,\r\n ChipModule,\r\n DropdownModule,\r\n OverlayPanelModule\r\n ],\r\n templateUrl: './chat-window.component.html',\r\n styleUrls: ['./chat-window.component.scss'],\r\n providers: [MessageService]\r\n})\r\nexport class ChatWindowComponent implements OnInit {\r\n @Input() chatRoomId!: string;\r\n @Input() header = 'Chat';\r\n @Input() metadata = '';\r\n @Input() chatUsers = [];\r\n @Input() addUserAllowed = true;\r\n @Input() mode: 'floating' | 'fullscreen' = 'floating';\r\n @Input() theme: 'light' | 'dark' = 'light';\r\n @Output() onArchive = new EventEmitter();\r\n\r\n refreshRoom = input<boolean>(false);\r\n // @Input() currentUser: any;\r\n\r\n chatService = inject(ChatService);\r\n socket = inject(SocketService);\r\n messageService = inject(MessageService);\r\n\r\n users = signal<any[]>([]);\r\n messages = signal<ChatMessage[]>([]);\r\n newMessage = '';\r\n minimized = false;\r\n loading = false;\r\n replyTo: ChatMessage | null = null;\r\n selectedUser: any;\r\n\r\n @ViewChild('messagesContainer') messagesContainer!: ElementRef<HTMLDivElement>;\r\n @ViewChild('reactionOverlay') reactionOverlay!: OverlayPanel;\r\n\r\n private observer!: MutationObserver;\r\n\r\n showUsers = false;\r\n suggestion = '';\r\n hoveredReactionUsers: string[] = [];\r\n\r\n constructor() {\r\n }\r\n\r\n ngOnInit() {\r\n this.socket.joinRoom(this.chatRoomId);\r\n this.socket.joinUserChannel(this.chatService.currentUser().userId);\r\n this.loadUsers();\r\n this.loadMessages();\r\n this.listenSocket();\r\n }\r\n\r\n loadUsers() {\r\n this.chatService.getRoomUsers(this.chatRoomId).subscribe(users => {\r\n this.users.set(users);\r\n });\r\n }\r\n\r\n loadMessages() {\r\n this.loading = true;\r\n this.chatService.getMessages(this.chatRoomId).subscribe({\r\n next: msgs => {\r\n this.messages.set(msgs);\r\n this.loading = false;\r\n },\r\n error: () => (this.loading = false)\r\n });\r\n }\r\n\r\n listenSocket() {\r\n this.socket.on<ChatMessage>('newMessage').subscribe(msg => {\r\n if (msg.chatRoomId === this.chatRoomId) {\r\n this.messages.update(list => [...list, msg]);\r\n }\r\n\r\n // if (msg.senderId !== this.chatService.currentUser().userId) {\r\n // this.messageService.add({\r\n // severity: 'info',\r\n // summary: this.header,\r\n // detail: msg.content ?? 'New message',\r\n // life: 2500\r\n // });\r\n // }\r\n });\r\n\r\n this.socket.on('roomUserAdded').subscribe((msg: any) => {\r\n if (msg.chatRoomId === this.chatRoomId) {\r\n this.loadUsers();\r\n // this.messageService.add({\r\n // severity: 'info',\r\n // summary: 'User Added',\r\n // detail: msg.user?.userName,\r\n // life: 2500\r\n // });\r\n }\r\n });\r\n\r\n this.socket.on('addedToRoom').subscribe((msg: any) => {\r\n if (msg.chatRoomId === this.chatRoomId) {\r\n this.loadUsers();\r\n }\r\n });\r\n\r\n this.socket.on('userAlreadyInRoom').subscribe((msg: any) => {\r\n // if (msg.chatRoomId === this.chatRoomId) {\r\n // this.messageService.add({\r\n // severity: 'info',\r\n // summary: 'User Already Added',\r\n // detail: msg.user?.userName,\r\n // life: 2500\r\n // });\r\n // }\r\n });\r\n }\r\n\r\n send() {\r\n const content = this.newMessage.trim();\r\n if (!content) return;\r\n\r\n this.chatService\r\n .sendMessage(this.chatRoomId, {\r\n senderId: this.chatService.currentUser().userId,\r\n senderName: this.chatService.currentUser().name,\r\n content,\r\n replyToMessageId: this.replyTo?.replyToMessageId ?? null,\r\n createdBy: this.chatService.currentUser().userId\r\n })\r\n .subscribe(() => {\r\n this.newMessage = '';\r\n this.replyTo = null;\r\n });\r\n }\r\n\r\n addUserToRoom() {\r\n this.chatService\r\n .addUserToRoom(\r\n this.chatRoomId,\r\n this.selectedUser?.user_id,\r\n this.selectedUser?.full_name,\r\n this.chatService.currentUser().userId)\r\n .subscribe((res) => {\r\n });\r\n }\r\n\r\n toggleMinimize() {\r\n this.minimized = !this.minimized;\r\n }\r\n\r\n archiveChat() {\r\n this.chatService.archiveRoom(this.chatRoomId).subscribe({\r\n next: () => {\r\n this.onArchive.emit(this.chatRoomId);\r\n },\r\n error: err => console.error(err)\r\n });\r\n }\r\n\r\n setReply(msg: ChatMessage) {\r\n this.replyTo = msg;\r\n }\r\n\r\n clearReply() {\r\n this.replyTo = null;\r\n }\r\n\r\n trackById(index: number, msg: ChatMessage) {\r\n return msg.id;\r\n }\r\n\r\n ngOnDestroy() {\r\n this.socket.offNewMessage();\r\n this.socket.offMessageSeen();\r\n this.observer?.disconnect();\r\n }\r\n\r\n ngAfterViewInit() {\r\n const el = this.messagesContainer.nativeElement;\r\n\r\n this.observer = new MutationObserver(() => {\r\n // 🔥 Scroll AFTER DOM actually changes\r\n el.scrollTop = el.scrollHeight;\r\n });\r\n\r\n this.observer.observe(el, {\r\n childList: true,\r\n subtree: true,\r\n characterData: true\r\n });\r\n }\r\n\r\n toggleUsers() {\r\n this.showUsers = !this.showUsers;\r\n }\r\n}\r\n","<p-toast></p-toast>\r\n\r\n<div class=\"chat-window\" [class.minimized]=\"minimized\" [class.floating]=\"mode === 'floating'\"\r\n [class.fullscreen]=\"mode === 'fullscreen'\" [class.dark]=\"theme === 'dark'\">\r\n <div class=\"chat-header\">\r\n <div style=\"display: flex; flex-direction: column;\">\r\n <div class=\"title\">\r\n <span>{{ header }}</span>\r\n <span *ngIf=\"users().length\">({{ users().length }} {{ users().length == 1 ? 'participant' :\r\n 'participants'}})</span>\r\n </div>\r\n <div>\r\n <span>{{ metadata }}</span>\r\n </div>\r\n </div>\r\n <div class=\"header-actions\">\r\n <button pButton icon=\"pi pi-users\" (click)=\"toggleUsers()\" style=\"font-size: 0.5rem\"></button>\r\n <button pButton icon=\"pi pi-minus\" (click)=\"toggleMinimize()\" style=\"font-size: 0.5rem\"></button>\r\n <button pButton icon=\"pi pi-trash\" (click)=\"archiveChat()\" style=\"font-size: 0.5rem\"></button>\r\n </div>\r\n </div>\r\n\r\n <div class=\"chat-body\" *ngIf=\"!minimized\">\r\n <div class=\"chat-layout\" [class.users-hidden]=\"!showUsers\">\r\n <div class=\"chat-main\" [class.fullscreen]=\"mode === 'fullscreen'\" [class.floating]=\"mode === 'floating'\">\r\n <div class=\"messages\" #messagesContainer [class.loading]=\"loading\">\r\n <div *ngFor=\"let msg of messages(); trackBy: trackById\" class=\"message-row\"\r\n [ngClass]=\"{ outgoing: msg.senderId === chatService.currentUser().userId, incoming: msg.senderId !== chatService.currentUser().userId }\">\r\n <div class=\"message-bubble\">\r\n <div class=\"message-meta\">\r\n <span class=\"sender\">\r\n <!-- *ngIf=\"msg.senderId !== chatService.currentUser().userId\" -->\r\n {{ msg.senderName }}\r\n </span>\r\n <!-- <span class=\"time\">\r\n {{ msg.createdAt | date: 'shortTime' }}\r\n </span> -->\r\n </div>\r\n\r\n <!-- MESSAGE TEXT -->\r\n <div class=\"message-content\">\r\n {{ msg.content }}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"input-area\">\r\n <div class=\"reply-banner\" *ngIf=\"replyTo\">\r\n <span>Replying to: {{ replyTo.content | slice: 0:50 }}</span>\r\n <button pButton icon=\"pi pi-times\" class=\"p-button-text p-button-sm\" (click)=\"clearReply()\"></button>\r\n </div>\r\n\r\n <textarea pInputTextarea [(ngModel)]=\"newMessage\" rows=\"2\" autoResize=\"true\" placeholder=\"Type a message\"\r\n (keyup.enter)=\"send()\">\r\n </textarea>\r\n\r\n <div class=\"input-actions\">\r\n <button pButton icon=\"pi pi-send\" label=\"Send\" (click)=\"send()\"></button>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"chat-sidebar\">\r\n <div class=\"section-title\">Users</div>\r\n <div class=\"user-list\">\r\n <div class=\"user-row\" *ngFor=\"let u of users()\">\r\n <p-avatar [label]=\"u.username[0]\"></p-avatar>\r\n <span>{{ u.username }}</span>\r\n </div>\r\n </div>\r\n @if(addUserAllowed) {\r\n <div class=\"user-list-add\">\r\n <p-dropdown [options]=\"chatService.userList()\" [(ngModel)]=\"selectedUser\" optionLabel=\"full_name\"\r\n placeholder=\"Select User\" />\r\n <div style=\"margin-top: 2em;\">\r\n <button pButton icon=\"pi pi-plus\" label=\"Add\" (click)=\"addUserToRoom()\"></button>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n</div>","import { Component, OnInit, signal, computed, inject, Input, effect, input, ViewEncapsulation } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { ChatWindowComponent } from '../chat-window/chat-window.component';\r\nimport { ChatService } from '../core/services/chat.service';\r\nimport { DropdownModule } from 'primeng/dropdown';\r\nimport { ButtonModule } from 'primeng/button';\r\nimport { ToastModule } from 'primeng/toast';\r\nimport { MessageService } from 'primeng/api';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { TabViewModule } from 'primeng/tabview';\r\nimport { SocketService } from '../core/services/socket.service';\r\n\r\ninterface OpenChatWindow {\r\n roomId: string;\r\n header: string;\r\n metadata: string;\r\n}\r\n\r\n@Component({\r\n selector: 'app-chat-launcher',\r\n standalone: true,\r\n imports: [CommonModule, ChatWindowComponent, DropdownModule, ButtonModule, ToastModule, FormsModule, TabViewModule],\r\n templateUrl: './chat-launcher.component.html',\r\n styleUrls: ['./chat-launcher.component.scss'],\r\n providers: [MessageService],\r\n encapsulation: ViewEncapsulation.Emulated,\r\n})\r\nexport class ChatLauncherComponent {\r\n\r\n roomId = input<string>('');\r\n roomHeader = input<string>('');\r\n metadata = input<string>('');\r\n user = input<any>(null);\r\n userList = input<any[]>([]);\r\n chatUsers = input<any[]>([]);\r\n\r\n chatService = inject(ChatService);\r\n socketService = inject(SocketService);\r\n messageService = inject(MessageService);\r\n openWindows = signal<OpenChatWindow[]>([]);\r\n lastOpenedRoom = signal<string | null>(null);\r\n activeIndex = signal(0);\r\n\r\n constructor() {\r\n effect(\r\n () => {\r\n const roomId = this.roomId();\r\n const header = this.roomHeader();\r\n const metadata = this.metadata();\r\n const user = this.user();\r\n\r\n this.chatService.currentUser.set({\r\n roomId: this.roomId(),\r\n userId: user?.userId,\r\n name: user?.name\r\n });\r\n\r\n this.chatService.userList.set(this.userList());\r\n\r\n if (!roomId || !user?.userId) return;\r\n if (this.lastOpenedRoom() === roomId) return;\r\n\r\n this.lastOpenedRoom.set(roomId);\r\n this.openNewRoom(roomId, header, metadata, user.userId, user.name, this.chatUsers());\r\n },\r\n { allowSignalWrites: true }\r\n );\r\n }\r\n\r\n ngOnInit() {\r\n console.log('ChatLauncher initialized');\r\n }\r\n\r\n openNewRoom(roomId: string, roomHeader: string, metadata: string, userId: string, username: string, chatUsers: any) {\r\n this.chatService.createRoom(roomId, roomHeader, metadata, userId, username, chatUsers).subscribe(room => {\r\n this.addWindow(room.roomKey, room.name, room.metadata);\r\n });\r\n }\r\n\r\n addWindow(roomId: string, header: string, metadata: string) {\r\n const windows = this.openWindows();\r\n const existingIndex = windows.findIndex(w => w.roomId === roomId);\r\n\r\n // already open → focus\r\n if (existingIndex !== -1) {\r\n this.activeIndex.set(existingIndex);\r\n return;\r\n }\r\n\r\n const newIndex = windows.length;\r\n\r\n this.openWindows.update(ws => [...ws, { roomId, header, metadata }]);\r\n\r\n // ✅ force real change: -1 → 0\r\n setTimeout(() => {\r\n this.activeIndex.set(newIndex);\r\n }, 500);\r\n }\r\n\r\n\r\n closeWindow(roomId: any) {\r\n this.openWindows.update(ws => ws.filter(w => w.roomId !== roomId));\r\n }\r\n\r\n setActive(i: number) {\r\n this.activeIndex.set(i);\r\n }\r\n}\r\n","<div class=\"chat-float-wrapper\">\r\n <p-tabView [activeIndex]=\"activeIndex()\" (activeIndexChange)=\"setActive($event)\" [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 mode=\"floating\" theme=\"light\" [chatRoomId]=\"w.roomId\" [header]=\"w.header\"\r\n [metadata]=\"w.metadata\" (onArchive)=\"closeWindow($event)\">\r\n </app-chat-window>\r\n </ng-template>\r\n </p-tabPanel>\r\n </p-tabView>\r\n</div>","import { Component, effect, EventEmitter, inject, input, Input, Output, signal } from '@angular/core';\r\nimport { ChatService } from '../core/services/chat.service';\r\nimport { ChatWindowComponent } from \"../chat-window/chat-window.component\";\r\nimport { ChatLauncherComponent } from '../chat-launcher/chat-launcher.component';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { AvatarModule } from 'primeng/avatar';\r\nimport { ButtonModule } from 'primeng/button';\r\nimport { ChipModule } from 'primeng/chip';\r\nimport { DropdownModule } from 'primeng/dropdown';\r\nimport { InputTextareaModule } from 'primeng/inputtextarea';\r\nimport { OverlayPanelModule } from 'primeng/overlaypanel';\r\nimport { ToastModule } from 'primeng/toast';\r\nimport { TooltipModule } from 'primeng/tooltip';\r\nimport { trigger, transition, style, animate } from '@angular/animations';\r\nimport { SocketService } from '../core/services/socket.service';\r\n\r\n@Component({\r\n selector: 'app-all-chats',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n ToastModule,\r\n ButtonModule,\r\n AvatarModule,\r\n TooltipModule,\r\n InputTextareaModule,\r\n ChipModule,\r\n DropdownModule,\r\n OverlayPanelModule,\r\n ChatWindowComponent\r\n ],\r\n templateUrl: './all-chats.component.html',\r\n styleUrl: './all-chats.component.scss',\r\n animations: [\r\n trigger('roomSwitch', [\r\n transition(':enter', [\r\n style({ opacity: 0, transform: 'translateX(24px)' }),\r\n animate(\r\n '300ms cubic-bezier(.4,0,.2,1)',\r\n style({ opacity: 1, transform: 'translateX(0)' })\r\n )\r\n ]),\r\n transition(':leave', [\r\n animate(\r\n '200ms ease-in',\r\n style({ opacity: 0, transform: 'translateX(-24px)' })\r\n )\r\n ])\r\n ])\r\n ]\r\n})\r\nexport class AllChatsComponent {\r\n\r\n user = input<any>(null);\r\n roomId = input<any>(null);\r\n chatUsers = signal<any[]>([]);\r\n\r\n @Output() newRoomLoaded = new EventEmitter();\r\n\r\n rooms: any[] = [];\r\n activeRoomId = signal<string>('');\r\n activeRoomHeader = signal<string>('');\r\n activeRoomMetadata = signal<string>('');\r\n\r\n chatService = inject(ChatService);\r\n socketService = inject(SocketService);\r\n showMessages: boolean = false\r\n\r\n constructor() {\r\n }\r\n\r\n ngOnInit() {\r\n if (!this.user) {\r\n console.error('user is required');\r\n return;\r\n }\r\n\r\n this.chatService.currentUser.set({\r\n roomId: this.activeRoomId,\r\n userId: this.user()?.id,\r\n name: this.user()?.name\r\n });\r\n\r\n this.chatService.getRooms(this.user()?.id, this.roomId())\r\n .subscribe(res => {\r\n this.rooms = res;\r\n if (this.rooms.length != 0) {\r\n this.selectRoom(this.rooms[0]);\r\n this.activeRoomId.set(this.rooms[0].ChatRoomId);\r\n this.activeRoomHeader.set(this.rooms[0].ChatRoomName);\r\n this.activeRoomMetadata.set(this.rooms[0].Metadata);\r\n } else {\r\n this.chatService\r\n .addUserToRoom(\r\n this.roomId(),\r\n this.user()?.id,\r\n this.user()?.name,\r\n this.chatService.currentUser().userId)\r\n .subscribe((res) => {\r\n this.rooms = [];\r\n this.getRooms();\r\n });\r\n }\r\n });\r\n }\r\n\r\n getRooms() {\r\n this.chatService.getRooms(this.user()?.id, this.roomId())\r\n .subscribe(res => {\r\n this.rooms = res;\r\n if (this.rooms.length != 0) {\r\n this.selectRoom(this.rooms[0]);\r\n this.activeRoomId.set(this.rooms[0].ChatRoomId);\r\n this.activeRoomHeader.set(this.rooms[0].ChatRoomName);\r\n this.activeRoomMetadata.set(this.rooms[0].Metadata);\r\n }\r\n });\r\n }\r\n\r\n selectRoom(room: any) {\r\n this.showMessages = false;\r\n this.activeRoomId.set(room.ChatRoomId);\r\n this.activeRoomHeader.set(room.ChatRoomName);\r\n this.activeRoomMetadata.set(room.Metadata);\r\n setTimeout(() => {\r\n this.showMessages = true;\r\n }, 1000);\r\n }\r\n}\r\n","<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 *ngFor=\"let room of rooms;\" class=\"room-item\" [class.active]=\"activeRoomId() === room.ChatRoomId\"\r\n (click)=\"selectRoom(room)\">\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 <section class=\"chat-main glass\" *ngIf=\"showMessages\" @roomSwitch>\r\n <app-chat-window mode=\"fullscreen\" theme=\"light\" [chatRoomId]=\"activeRoomId()\" [header]=\"activeRoomHeader()\"\r\n [metadata]=\"activeRoomMetadata()\" [addUserAllowed]=\"false\">\r\n </app-chat-window>\r\n </section>\r\n</div>","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { ChatLauncherComponent } from './chat-launcher/chat-launcher.component';\r\nimport { ChatWindowComponent } from './chat-window/chat-window.component';\r\nimport { AllChatsComponent } from './all-chats/all-chats.component';\r\n\r\n@NgModule({\r\n declarations: [\r\n ],\r\n imports: [\r\n CommonModule,\r\n ChatLauncherComponent,\r\n ChatWindowComponent,\r\n AllChatsComponent\r\n ],\r\n exports: [ChatLauncherComponent]\r\n})\r\nexport class ChatWidgetModule { }\r\n","/*\r\n * Public API Surface of chat-widget\r\n */\r\n\r\nexport * from './lib/chat-widget.module';\r\nexport * from './lib/chat-launcher/chat-launcher.component';\r\nexport * from './lib/all-chats/all-chats.component';\r\nexport * from './lib/core/models/chat.models';\r\n\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","i3"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"arthakosh-chat-widget.mjs","sources":["../../../projects/chat-widget/src/lib/core/config/chat.tokens.ts","../../../projects/chat-widget/src/lib/core/services/chat.service.ts","../../../projects/chat-widget/src/lib/core/services/socket.service.ts","../../../projects/chat-widget/src/lib/chat-window/chat-window.component.ts","../../../projects/chat-widget/src/lib/chat-window/chat-window.component.html","../../../projects/chat-widget/src/lib/chat-launcher/chat-launcher.component.ts","../../../projects/chat-widget/src/lib/chat-launcher/chat-launcher.component.html","../../../projects/chat-widget/src/lib/all-chats/all-chats.component.ts","../../../projects/chat-widget/src/lib/all-chats/all-chats.component.html","../../../projects/chat-widget/src/lib/chat-widget.module.ts","../../../projects/chat-widget/src/public-api.ts","../../../projects/chat-widget/src/arthakosh-chat-widget.ts"],"sourcesContent":["// chat.tokens.ts\r\nimport { InjectionToken } from '@angular/core';\r\nimport { ChatConfig } from './chat-config';\r\n\r\nexport const CHAT_CONFIG = new InjectionToken<ChatConfig>('CHAT_CONFIG');\r\n","import {Inject, Injectable, signal} from '@angular/core';\r\nimport {HttpClient} from '@angular/common/http';\r\nimport {map} from 'rxjs/operators';\r\nimport {Observable} from 'rxjs';\r\nimport {ChatMessage} from '../models/chat.models';\r\nimport {CHAT_CONFIG} from \"../config/chat.tokens\";\r\nimport {ChatConfig} from \"../config/chat-config\";\r\n\r\n@Injectable({providedIn: 'root'})\r\nexport class ChatService {\r\n // private baseUrl = `https://coreuatarthkosh.sarjak.com`;\r\n\r\n currentUser = signal<any | null>(null);\r\n userList = signal<any[]>([]);\r\n archiveRoomId = signal<string>('');\r\n\r\n constructor(private http: HttpClient, @Inject(CHAT_CONFIG) private config: ChatConfig) {\r\n }\r\n\r\n get baseUrl() {\r\n return this.config.apiBaseUrl;\r\n }\r\n\r\n /* ---------------- CHAT ROOMS ---------------- */\r\n createRoom(roomId: string, name: string, metadata: string, createdBy: string, username: string, chatUsers: any): Observable<any> {\r\n return this.http.post(`${this.baseUrl}/api/chat/chatrooms/create/${roomId}/`, {\r\n name,\r\n metadata,\r\n createdBy,\r\n username,\r\n chatUsers\r\n });\r\n }\r\n\r\n getRoomUsers(roomId: string): Observable<any[]> {\r\n return this.http.get<any[]>(`${this.baseUrl}/api/chat/chatrooms/get_user/${roomId}/users/`).pipe(\r\n map(list =>\r\n list.map(u => ({\r\n id: u.UserId,\r\n username: u.UserName\r\n }))\r\n )\r\n );\r\n }\r\n\r\n addUserToRoom(roomId: string, userId: string, userName: string, createdBy: string) {\r\n return this.http.post(`${this.baseUrl}/api/chat/chatrooms/add_user/${roomId}/users/add/`, {\r\n userId,\r\n userName,\r\n createdBy\r\n });\r\n }\r\n\r\n /* ---------------- MESSAGES ---------------- */\r\n getMessages(roomId: string, since?: string): Observable<ChatMessage[]> {\r\n const params: any = {};\r\n if (since) params.since = since;\r\n\r\n return this.http.get<any[]>(`${this.baseUrl}/api/chat/messages/rooms/all_messages/${roomId}/`, {params}).pipe(\r\n map(list =>\r\n list.map(m => ({\r\n id: m.id,\r\n chatRoomId: m.chatRoomId,\r\n senderId: m.senderId,\r\n senderName: m.senderName,\r\n content: m.content,\r\n replyToMessageId: m.replyToMessageId,\r\n createdAt: m.createdAt,\r\n hasAttachment: m.hasAttachment ?? false,\r\n }))\r\n )\r\n );\r\n }\r\n\r\n sendMessage(\r\n roomId: string,\r\n payload: {\r\n senderId: string;\r\n senderName: string,\r\n content: string;\r\n replyToMessageId?: string | null,\r\n createdBy: string\r\n }\r\n ): Observable<ChatMessage> {\r\n return this.http.post<any>(`${this.baseUrl}/api/chat/messages/rooms/send/${roomId}/`, payload).pipe(\r\n map(m => ({\r\n id: m.id,\r\n chatRoomId: m.chatRoomId,\r\n senderId: m.senderId,\r\n senderName: m.senderName,\r\n content: m.content,\r\n replyToMessageId: m.replyToMessageId,\r\n createdAt: m.createdAt,\r\n hasAttachment: m.hasAttachment ?? false,\r\n }))\r\n );\r\n }\r\n\r\n getRooms(loggedInUserId: string, chatRoomId?: string) {\r\n let url = `${this.baseUrl}/api/chat/chatrooms/${loggedInUserId}`;\r\n if (chatRoomId) {\r\n url += `/${chatRoomId}`;\r\n }\r\n return this.http.get<any[]>(`${url}/`);\r\n }\r\n\r\n\r\n archiveRoom(roomId: string) {\r\n return this.http.delete<any[]>(`${this.baseUrl}/api/chat/chatrooms/archive/${roomId}/`);\r\n }\r\n}\r\n","import {Inject, Injectable} from '@angular/core';\r\nimport {Observable} from 'rxjs';\r\nimport {CHAT_CONFIG} from \"../config/chat.tokens\";\r\nimport {ChatConfig} from \"../config/chat-config\";\r\n\r\n@Injectable({providedIn: 'root'})\r\nexport class SocketService {\r\n\r\n private socket!: WebSocket;\r\n private listeners = new Map<string, ((data: any) => void)[]>();\r\n\r\n constructor(@Inject(CHAT_CONFIG) private config: ChatConfig) {\r\n this.connect();\r\n }\r\n\r\n private connect() {\r\n // this.socket = new WebSocket('wss://coreuatarthkosh.sarjak.com/ws/');\r\n\r\n this.socket = new WebSocket(`${this.config.wsBaseUrl}/ws/`);\r\n\r\n this.socket.onopen = () => {\r\n console.log('[WS] Connected');\r\n };\r\n\r\n this.socket.onmessage = (event) => {\r\n const msg: any = JSON.parse(event.data);\r\n const handlers = this.listeners.get(msg.event) || [];\r\n handlers.forEach(h => h(msg.data));\r\n };\r\n\r\n this.socket.onerror = (err) => {\r\n console.error('[WS] Error', err);\r\n };\r\n\r\n this.socket.onclose = () => {\r\n console.warn('[WS] Disconnected – reconnecting...');\r\n setTimeout(() => this.connect(), 2000);\r\n };\r\n }\r\n\r\n emit(event: string, data?: any) {\r\n const payload: any = {event, data};\r\n this.socket.send(JSON.stringify(payload));\r\n }\r\n\r\n joinRoom(roomId: string) {\r\n this.emit('joinRoom', roomId);\r\n }\r\n\r\n joinUserChannel(userId: string) {\r\n this.emit('joinUserChannel', userId);\r\n }\r\n\r\n sendMessage(data: any) {\r\n this.emit('sendMessage', data);\r\n }\r\n\r\n messageSeen(data: { chatRoomId: string; userId: string }) {\r\n this.emit('messageSeen', data);\r\n }\r\n\r\n on<T>(event: string): Observable<T> {\r\n return new Observable(sub => {\r\n const handler = (data: T) => sub.next(data);\r\n\r\n if (!this.listeners.has(event)) {\r\n this.listeners.set(event, []);\r\n }\r\n this.listeners.get(event)!.push(handler);\r\n\r\n return () => {\r\n const arr = this.listeners.get(event) || [];\r\n this.listeners.set(event, arr.filter(h => h !== handler));\r\n };\r\n });\r\n }\r\n\r\n onNewMessage(cb: (msg: any) => void) {\r\n this.addListener('newMessage', cb);\r\n }\r\n\r\n offNewMessage(cb?: (msg: any) => void) {\r\n this.removeListener('newMessage', cb);\r\n }\r\n\r\n onMessageSeen(cb: (data: { chatRoomId: string; userId: string }) => void) {\r\n this.addListener('messageSeen', cb);\r\n }\r\n\r\n offMessageSeen(cb?: (data: any) => void) {\r\n this.removeListener('messageSeen', cb);\r\n }\r\n\r\n private addListener(event: string, cb: (data: any) => void) {\r\n if (!this.listeners.has(event)) {\r\n this.listeners.set(event, []);\r\n }\r\n this.listeners.get(event)!.push(cb);\r\n }\r\n\r\n private removeListener(event: string, cb?: (data: any) => void) {\r\n if (!cb) {\r\n this.listeners.delete(event);\r\n return;\r\n }\r\n const arr = this.listeners.get(event) || [];\r\n this.listeners.set(event, arr.filter(h => h !== cb));\r\n }\r\n}\r\n","import { Component, ElementRef, EventEmitter, Input, OnInit, Output, SimpleChanges, ViewChild, effect, inject, input, signal } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { ChatService } from '../core/services/chat.service';\r\nimport { SocketService } from '../core/services/socket.service';\r\nimport { ToastModule } from 'primeng/toast';\r\nimport { MessageService } from 'primeng/api';\r\nimport { ButtonModule } from 'primeng/button';\r\nimport { AvatarModule } from 'primeng/avatar';\r\nimport { TooltipModule } from 'primeng/tooltip';\r\nimport { InputTextareaModule } from 'primeng/inputtextarea';\r\nimport { DropdownModule } from 'primeng/dropdown';\r\nimport { ChipModule } from 'primeng/chip';\r\nimport { ChatMessage } from '../core/models/chat.models';\r\nimport { OverlayPanelModule } from 'primeng/overlaypanel';\r\nimport { OverlayPanel } from 'primeng/overlaypanel';\r\n\r\n@Component({\r\n selector: 'app-chat-window',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n ToastModule,\r\n ButtonModule,\r\n AvatarModule,\r\n TooltipModule,\r\n InputTextareaModule,\r\n ChipModule,\r\n DropdownModule,\r\n OverlayPanelModule\r\n ],\r\n templateUrl: './chat-window.component.html',\r\n styleUrls: ['./chat-window.component.scss'],\r\n providers: [MessageService]\r\n})\r\nexport class ChatWindowComponent implements OnInit {\r\n @Input() chatRoomId!: string;\r\n @Input() header = 'Chat';\r\n @Input() metadata = '';\r\n @Input() chatUsers = [];\r\n @Input() addUserAllowed = true;\r\n @Input() mode: 'floating' | 'fullscreen' = 'floating';\r\n @Input() theme: 'light' | 'dark' = 'light';\r\n @Output() onArchive = new EventEmitter();\r\n\r\n refreshRoom = input<boolean>(false);\r\n // @Input() currentUser: any;\r\n\r\n chatService = inject(ChatService);\r\n socket = inject(SocketService);\r\n messageService = inject(MessageService);\r\n\r\n users = signal<any[]>([]);\r\n messages = signal<ChatMessage[]>([]);\r\n newMessage = '';\r\n minimized = false;\r\n loading = false;\r\n replyTo: ChatMessage | null = null;\r\n selectedUser: any;\r\n\r\n @ViewChild('messagesContainer') messagesContainer!: ElementRef<HTMLDivElement>;\r\n @ViewChild('reactionOverlay') reactionOverlay!: OverlayPanel;\r\n\r\n private observer!: MutationObserver;\r\n\r\n showUsers = false;\r\n suggestion = '';\r\n hoveredReactionUsers: string[] = [];\r\n\r\n constructor() {\r\n }\r\n\r\n ngOnInit() {\r\n this.socket.joinRoom(this.chatRoomId);\r\n this.socket.joinUserChannel(this.chatService.currentUser().userId);\r\n this.loadUsers();\r\n this.loadMessages();\r\n this.listenSocket();\r\n }\r\n\r\n loadUsers() {\r\n this.chatService.getRoomUsers(this.chatRoomId).subscribe(users => {\r\n this.users.set(users);\r\n });\r\n }\r\n\r\n loadMessages() {\r\n this.loading = true;\r\n this.chatService.getMessages(this.chatRoomId).subscribe({\r\n next: msgs => {\r\n this.messages.set(msgs);\r\n this.loading = false;\r\n },\r\n error: () => (this.loading = false)\r\n });\r\n }\r\n\r\n listenSocket() {\r\n this.socket.on<ChatMessage>('newMessage').subscribe(msg => {\r\n if (msg.chatRoomId === this.chatRoomId) {\r\n this.messages.update(list => [...list, msg]);\r\n }\r\n\r\n // if (msg.senderId !== this.chatService.currentUser().userId) {\r\n // this.messageService.add({\r\n // severity: 'info',\r\n // summary: this.header,\r\n // detail: msg.content ?? 'New message',\r\n // life: 2500\r\n // });\r\n // }\r\n });\r\n\r\n this.socket.on('roomUserAdded').subscribe((msg: any) => {\r\n if (msg.chatRoomId === this.chatRoomId) {\r\n this.loadUsers();\r\n // this.messageService.add({\r\n // severity: 'info',\r\n // summary: 'User Added',\r\n // detail: msg.user?.userName,\r\n // life: 2500\r\n // });\r\n }\r\n });\r\n\r\n this.socket.on('addedToRoom').subscribe((msg: any) => {\r\n if (msg.chatRoomId === this.chatRoomId) {\r\n this.loadUsers();\r\n }\r\n });\r\n\r\n this.socket.on('userAlreadyInRoom').subscribe((msg: any) => {\r\n // if (msg.chatRoomId === this.chatRoomId) {\r\n // this.messageService.add({\r\n // severity: 'info',\r\n // summary: 'User Already Added',\r\n // detail: msg.user?.userName,\r\n // life: 2500\r\n // });\r\n // }\r\n });\r\n }\r\n\r\n send() {\r\n const content = this.newMessage.trim();\r\n if (!content) return;\r\n\r\n this.chatService\r\n .sendMessage(this.chatRoomId, {\r\n senderId: this.chatService.currentUser().userId,\r\n senderName: this.chatService.currentUser().name,\r\n content,\r\n replyToMessageId: this.replyTo?.replyToMessageId ?? null,\r\n createdBy: this.chatService.currentUser().userId\r\n })\r\n .subscribe(() => {\r\n this.newMessage = '';\r\n this.replyTo = null;\r\n });\r\n }\r\n\r\n addUserToRoom() {\r\n this.chatService\r\n .addUserToRoom(\r\n this.chatRoomId,\r\n this.selectedUser?.user_id,\r\n this.selectedUser?.full_name,\r\n this.chatService.currentUser().userId)\r\n .subscribe((res) => {\r\n });\r\n }\r\n\r\n toggleMinimize() {\r\n this.minimized = !this.minimized;\r\n }\r\n\r\n archiveChat() {\r\n this.chatService.archiveRoom(this.chatRoomId).subscribe({\r\n next: () => {\r\n this.onArchive.emit(this.chatRoomId);\r\n },\r\n error: err => console.error(err)\r\n });\r\n }\r\n\r\n setReply(msg: ChatMessage) {\r\n this.replyTo = msg;\r\n }\r\n\r\n clearReply() {\r\n this.replyTo = null;\r\n }\r\n\r\n trackById(index: number, msg: ChatMessage) {\r\n return msg.id;\r\n }\r\n\r\n ngOnDestroy() {\r\n this.socket.offNewMessage();\r\n this.socket.offMessageSeen();\r\n this.observer?.disconnect();\r\n }\r\n\r\n ngAfterViewInit() {\r\n const el = this.messagesContainer.nativeElement;\r\n\r\n this.observer = new MutationObserver(() => {\r\n // 🔥 Scroll AFTER DOM actually changes\r\n el.scrollTop = el.scrollHeight;\r\n });\r\n\r\n this.observer.observe(el, {\r\n childList: true,\r\n subtree: true,\r\n characterData: true\r\n });\r\n }\r\n\r\n toggleUsers() {\r\n this.showUsers = !this.showUsers;\r\n }\r\n}\r\n","<p-toast></p-toast>\r\n\r\n<div class=\"chat-window\" [class.minimized]=\"minimized\" [class.floating]=\"mode === 'floating'\"\r\n [class.fullscreen]=\"mode === 'fullscreen'\" [class.dark]=\"theme === 'dark'\">\r\n <div class=\"chat-header\">\r\n <div style=\"display: flex; flex-direction: column;\">\r\n <div class=\"title\">\r\n <span>{{ header }}</span>\r\n <span *ngIf=\"users().length\">({{ users().length }} {{ users().length == 1 ? 'participant' :\r\n 'participants'}})</span>\r\n </div>\r\n <div>\r\n <span>{{ metadata }}</span>\r\n </div>\r\n </div>\r\n <div class=\"header-actions\">\r\n <button pButton icon=\"pi pi-users\" (click)=\"toggleUsers()\" style=\"font-size: 0.5rem\" pTooltip=\"Toogle Users\"></button>\r\n <button pButton [icon]=\"minimized ? 'pi pi-plus' : 'pi pi-minus'\" (click)=\"toggleMinimize()\" style=\"font-size: 0.5rem\" pTooltip=\"Hide/Show\"></button>\r\n <button pButton icon=\"pi pi-trash\" (click)=\"archiveChat()\" style=\"font-size: 0.5rem\" pTooltip=\"Archive\"></button>\r\n </div>\r\n </div>\r\n\r\n <div class=\"chat-body\" *ngIf=\"!minimized\">\r\n <div class=\"chat-layout\" [class.users-hidden]=\"!showUsers\">\r\n <div class=\"chat-main\" [class.fullscreen]=\"mode === 'fullscreen'\" [class.floating]=\"mode === 'floating'\">\r\n <div class=\"messages\" #messagesContainer [class.loading]=\"loading\">\r\n <div *ngFor=\"let msg of messages(); trackBy: trackById\" class=\"message-row\"\r\n [ngClass]=\"{ outgoing: msg.senderId === chatService.currentUser().userId, incoming: msg.senderId !== chatService.currentUser().userId }\">\r\n <div class=\"message-bubble\">\r\n <div class=\"message-meta\">\r\n <span class=\"sender\">\r\n <!-- *ngIf=\"msg.senderId !== chatService.currentUser().userId\" -->\r\n {{ msg.senderName }}\r\n </span>\r\n <!-- <span class=\"time\">\r\n {{ msg.createdAt | date: 'shortTime' }}\r\n </span> -->\r\n </div>\r\n\r\n <!-- MESSAGE TEXT -->\r\n <div class=\"message-content\">\r\n {{ msg.content }}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"input-area\">\r\n <div class=\"reply-banner\" *ngIf=\"replyTo\">\r\n <span>Replying to: {{ replyTo.content | slice: 0:50 }}</span>\r\n <button pButton icon=\"pi pi-times\" class=\"p-button-text p-button-sm\" (click)=\"clearReply()\"></button>\r\n </div>\r\n\r\n <textarea pInputTextarea [(ngModel)]=\"newMessage\" rows=\"2\" autoResize=\"true\" placeholder=\"Type a message\"\r\n (keyup.enter)=\"send()\">\r\n </textarea>\r\n\r\n <div class=\"input-actions\">\r\n <button pButton icon=\"pi pi-send\" label=\"Send\" (click)=\"send()\"></button>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"chat-sidebar\">\r\n <div class=\"section-title\">Users</div>\r\n <div class=\"user-list\">\r\n <div class=\"user-row\" *ngFor=\"let u of users()\">\r\n <p-avatar [label]=\"u.username[0]\"></p-avatar>\r\n <span>{{ u.username }}</span>\r\n </div>\r\n </div>\r\n @if(addUserAllowed) {\r\n <div class=\"user-list-add\">\r\n <p-dropdown [options]=\"chatService.userList()\" [(ngModel)]=\"selectedUser\" optionLabel=\"full_name\"\r\n placeholder=\"Select User\" />\r\n <div style=\"margin-top: 2em;\">\r\n <button pButton icon=\"pi pi-plus\" label=\"Add\" (click)=\"addUserToRoom()\"></button>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n</div>","import { Component, OnInit, signal, computed, inject, Input, effect, input, ViewEncapsulation } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { ChatWindowComponent } from '../chat-window/chat-window.component';\r\nimport { ChatService } from '../core/services/chat.service';\r\nimport { DropdownModule } from 'primeng/dropdown';\r\nimport { ButtonModule } from 'primeng/button';\r\nimport { ToastModule } from 'primeng/toast';\r\nimport { MessageService } from 'primeng/api';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { TabViewModule } from 'primeng/tabview';\r\nimport { SocketService } from '../core/services/socket.service';\r\n\r\ninterface OpenChatWindow {\r\n roomId: string;\r\n header: string;\r\n metadata: string;\r\n}\r\n\r\n@Component({\r\n selector: 'app-chat-launcher',\r\n standalone: true,\r\n imports: [CommonModule, ChatWindowComponent, DropdownModule, ButtonModule, ToastModule, FormsModule, TabViewModule],\r\n templateUrl: './chat-launcher.component.html',\r\n styleUrls: ['./chat-launcher.component.scss'],\r\n providers: [MessageService],\r\n encapsulation: ViewEncapsulation.Emulated,\r\n})\r\nexport class ChatLauncherComponent {\r\n\r\n roomId = input<string>('');\r\n roomHeader = input<string>('');\r\n metadata = input<string>('');\r\n user = input<any>(null);\r\n userList = input<any[]>([]);\r\n chatUsers = input<any[]>([]);\r\n\r\n chatService = inject(ChatService);\r\n socketService = inject(SocketService);\r\n messageService = inject(MessageService);\r\n openWindows = signal<OpenChatWindow[]>([]);\r\n lastOpenedRoom = signal<string | null>(null);\r\n activeIndex = signal(0);\r\n\r\n constructor() {\r\n effect(\r\n () => {\r\n const roomId = this.roomId();\r\n const header = this.roomHeader();\r\n const metadata = this.metadata();\r\n const user = this.user();\r\n\r\n this.chatService.currentUser.set({\r\n roomId: this.roomId(),\r\n userId: user?.userId,\r\n name: user?.name\r\n });\r\n\r\n this.chatService.userList.set(this.userList());\r\n\r\n if (!roomId || !user?.userId) return;\r\n if (this.lastOpenedRoom() === roomId) return;\r\n\r\n this.lastOpenedRoom.set(roomId);\r\n this.openNewRoom(roomId, header, metadata, user.userId, user.name, this.chatUsers());\r\n },\r\n { allowSignalWrites: true }\r\n );\r\n }\r\n\r\n ngOnInit() {\r\n console.log('ChatLauncher initialized');\r\n }\r\n\r\n openNewRoom(roomId: string, roomHeader: string, metadata: string, userId: string, username: string, chatUsers: any) {\r\n this.chatService.createRoom(roomId, roomHeader, metadata, userId, username, chatUsers).subscribe(room => {\r\n this.addWindow(room.roomKey, room.name, room.metadata);\r\n });\r\n }\r\n\r\n addWindow(roomId: string, header: string, metadata: string) {\r\n const windows = this.openWindows();\r\n const existingIndex = windows.findIndex(w => w.roomId === roomId);\r\n\r\n // already open → focus\r\n if (existingIndex !== -1) {\r\n this.activeIndex.set(existingIndex);\r\n return;\r\n }\r\n\r\n const newIndex = windows.length;\r\n\r\n this.openWindows.update(ws => [...ws, { roomId, header, metadata }]);\r\n\r\n // ✅ force real change: -1 → 0\r\n setTimeout(() => {\r\n this.activeIndex.set(newIndex);\r\n }, 500);\r\n }\r\n\r\n\r\n closeWindow(roomId: any) {\r\n this.openWindows.update(ws => ws.filter(w => w.roomId !== roomId));\r\n }\r\n\r\n setActive(i: number) {\r\n this.activeIndex.set(i);\r\n }\r\n}\r\n","<div class=\"chat-float-wrapper\">\r\n <p-tabView [activeIndex]=\"activeIndex()\" (activeIndexChange)=\"setActive($event)\" [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 mode=\"floating\" theme=\"light\" [chatRoomId]=\"w.roomId\" [header]=\"w.header\"\r\n [metadata]=\"w.metadata\" (onArchive)=\"closeWindow($event)\">\r\n </app-chat-window>\r\n </ng-template>\r\n </p-tabPanel>\r\n </p-tabView>\r\n</div>","import { Component, effect, EventEmitter, inject, input, Input, Output, signal } from '@angular/core';\r\nimport { ChatService } from '../core/services/chat.service';\r\nimport { ChatWindowComponent } from \"../chat-window/chat-window.component\";\r\nimport { ChatLauncherComponent } from '../chat-launcher/chat-launcher.component';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { AvatarModule } from 'primeng/avatar';\r\nimport { ButtonModule } from 'primeng/button';\r\nimport { ChipModule } from 'primeng/chip';\r\nimport { DropdownModule } from 'primeng/dropdown';\r\nimport { InputTextareaModule } from 'primeng/inputtextarea';\r\nimport { OverlayPanelModule } from 'primeng/overlaypanel';\r\nimport { ToastModule } from 'primeng/toast';\r\nimport { TooltipModule } from 'primeng/tooltip';\r\nimport { trigger, transition, style, animate } from '@angular/animations';\r\nimport { SocketService } from '../core/services/socket.service';\r\n\r\n@Component({\r\n selector: 'app-all-chats',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n ToastModule,\r\n ButtonModule,\r\n AvatarModule,\r\n TooltipModule,\r\n InputTextareaModule,\r\n ChipModule,\r\n DropdownModule,\r\n OverlayPanelModule,\r\n ChatWindowComponent\r\n ],\r\n templateUrl: './all-chats.component.html',\r\n styleUrl: './all-chats.component.scss',\r\n animations: [\r\n trigger('roomSwitch', [\r\n transition(':enter', [\r\n style({ opacity: 0, transform: 'translateX(24px)' }),\r\n animate(\r\n '300ms cubic-bezier(.4,0,.2,1)',\r\n style({ opacity: 1, transform: 'translateX(0)' })\r\n )\r\n ]),\r\n transition(':leave', [\r\n animate(\r\n '200ms ease-in',\r\n style({ opacity: 0, transform: 'translateX(-24px)' })\r\n )\r\n ])\r\n ])\r\n ]\r\n})\r\nexport class AllChatsComponent {\r\n\r\n user = input<any>(null);\r\n roomId = input<any>(null);\r\n chatUsers = signal<any[]>([]);\r\n\r\n @Output() newRoomLoaded = new EventEmitter();\r\n\r\n rooms: any[] = [];\r\n activeRoomId = signal<string>('');\r\n activeRoomHeader = signal<string>('');\r\n activeRoomMetadata = signal<string>('');\r\n\r\n chatService = inject(ChatService);\r\n socketService = inject(SocketService);\r\n showMessages: boolean = false\r\n\r\n constructor() {\r\n }\r\n\r\n ngOnInit() {\r\n if (!this.user) {\r\n console.error('user is required');\r\n return;\r\n }\r\n\r\n this.chatService.currentUser.set({\r\n roomId: this.activeRoomId,\r\n userId: this.user()?.id,\r\n name: this.user()?.name\r\n });\r\n\r\n this.chatService.getRooms(this.user()?.id, this.roomId())\r\n .subscribe(res => {\r\n this.rooms = res;\r\n if (this.rooms.length != 0) {\r\n this.selectRoom(this.rooms[0]);\r\n this.activeRoomId.set(this.rooms[0].ChatRoomId);\r\n this.activeRoomHeader.set(this.rooms[0].ChatRoomName);\r\n this.activeRoomMetadata.set(this.rooms[0].Metadata);\r\n } else {\r\n this.chatService\r\n .addUserToRoom(\r\n this.roomId(),\r\n this.user()?.id,\r\n this.user()?.name,\r\n this.chatService.currentUser().userId)\r\n .subscribe((res) => {\r\n this.rooms = [];\r\n this.getRooms();\r\n });\r\n }\r\n });\r\n }\r\n\r\n getRooms() {\r\n this.chatService.getRooms(this.user()?.id, this.roomId())\r\n .subscribe(res => {\r\n this.rooms = res;\r\n if (this.rooms.length != 0) {\r\n this.selectRoom(this.rooms[0]);\r\n this.activeRoomId.set(this.rooms[0].ChatRoomId);\r\n this.activeRoomHeader.set(this.rooms[0].ChatRoomName);\r\n this.activeRoomMetadata.set(this.rooms[0].Metadata);\r\n }\r\n });\r\n }\r\n\r\n selectRoom(room: any) {\r\n this.showMessages = false;\r\n this.activeRoomId.set(room.ChatRoomId);\r\n this.activeRoomHeader.set(room.ChatRoomName);\r\n this.activeRoomMetadata.set(room.Metadata);\r\n setTimeout(() => {\r\n this.showMessages = true;\r\n }, 1000);\r\n }\r\n}\r\n","<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 *ngFor=\"let room of rooms;\" class=\"room-item\" [class.active]=\"activeRoomId() === room.ChatRoomId\"\r\n (click)=\"selectRoom(room)\">\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 <section class=\"chat-main glass\" *ngIf=\"showMessages\" @roomSwitch>\r\n <app-chat-window mode=\"fullscreen\" theme=\"light\" [chatRoomId]=\"activeRoomId()\" [header]=\"activeRoomHeader()\"\r\n [metadata]=\"activeRoomMetadata()\" [addUserAllowed]=\"false\">\r\n </app-chat-window>\r\n </section>\r\n</div>","import { ModuleWithProviders, NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { ChatLauncherComponent } from './chat-launcher/chat-launcher.component';\r\nimport { ChatWindowComponent } from './chat-window/chat-window.component';\r\nimport { AllChatsComponent } from './all-chats/all-chats.component';\r\nimport { CHAT_CONFIG } from './core/config/chat.tokens';\r\nimport type { ChatConfig } from './core/config/chat-config';\r\n\r\n@NgModule({\r\n declarations: [\r\n ],\r\n imports: [\r\n CommonModule,\r\n ChatLauncherComponent,\r\n ChatWindowComponent,\r\n AllChatsComponent\r\n ],\r\n exports: [ChatLauncherComponent]\r\n})\r\nexport class ChatWidgetModule {\r\n static forRoot(config: ChatConfig): ModuleWithProviders<ChatWidgetModule> {\r\n return {\r\n ngModule: ChatWidgetModule,\r\n providers: [\r\n {\r\n provide: CHAT_CONFIG,\r\n useValue: config\r\n }\r\n ]\r\n };\r\n }\r\n}\r\n","/*\r\n * Public API Surface of chat-widget\r\n */\r\n\r\nexport * from './lib/chat-widget.module';\r\nexport * from './lib/chat-launcher/chat-launcher.component';\r\nexport * from './lib/all-chats/all-chats.component';\r\nexport * from './lib/core/models/chat.models';\r\n\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","i3"],"mappings":"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"}
|
|
@@ -1,9 +1,12 @@
|
|
|
1
|
+
import { ModuleWithProviders } from '@angular/core';
|
|
2
|
+
import type { ChatConfig } from './core/config/chat-config';
|
|
1
3
|
import * as i0 from "@angular/core";
|
|
2
4
|
import * as i1 from "@angular/common";
|
|
3
5
|
import * as i2 from "./chat-launcher/chat-launcher.component";
|
|
4
6
|
import * as i3 from "./chat-window/chat-window.component";
|
|
5
7
|
import * as i4 from "./all-chats/all-chats.component";
|
|
6
8
|
export declare class ChatWidgetModule {
|
|
9
|
+
static forRoot(config: ChatConfig): ModuleWithProviders<ChatWidgetModule>;
|
|
7
10
|
static ɵfac: i0.ɵɵFactoryDeclaration<ChatWidgetModule, never>;
|
|
8
11
|
static ɵmod: i0.ɵɵNgModuleDeclaration<ChatWidgetModule, never, [typeof i1.CommonModule, typeof i2.ChatLauncherComponent, typeof i3.ChatWindowComponent, typeof i4.AllChatsComponent], [typeof i2.ChatLauncherComponent]>;
|
|
9
12
|
static ɵinj: i0.ɵɵInjectorDeclaration<ChatWidgetModule>;
|
|
@@ -1,14 +1,16 @@
|
|
|
1
1
|
import { HttpClient } from '@angular/common/http';
|
|
2
2
|
import { Observable } from 'rxjs';
|
|
3
3
|
import { ChatMessage } from '../models/chat.models';
|
|
4
|
+
import { ChatConfig } from "../config/chat-config";
|
|
4
5
|
import * as i0 from "@angular/core";
|
|
5
6
|
export declare class ChatService {
|
|
6
7
|
private http;
|
|
7
|
-
private
|
|
8
|
+
private config;
|
|
8
9
|
currentUser: import("@angular/core").WritableSignal<any>;
|
|
9
10
|
userList: import("@angular/core").WritableSignal<any[]>;
|
|
10
11
|
archiveRoomId: import("@angular/core").WritableSignal<string>;
|
|
11
|
-
constructor(http: HttpClient);
|
|
12
|
+
constructor(http: HttpClient, config: ChatConfig);
|
|
13
|
+
get baseUrl(): string;
|
|
12
14
|
createRoom(roomId: string, name: string, metadata: string, createdBy: string, username: string, chatUsers: any): Observable<any>;
|
|
13
15
|
getRoomUsers(roomId: string): Observable<any[]>;
|
|
14
16
|
addUserToRoom(roomId: string, userId: string, userName: string, createdBy: string): Observable<Object>;
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import { Observable } from 'rxjs';
|
|
2
|
+
import { ChatConfig } from "../config/chat-config";
|
|
2
3
|
import * as i0 from "@angular/core";
|
|
3
4
|
export declare class SocketService {
|
|
5
|
+
private config;
|
|
4
6
|
private socket;
|
|
5
7
|
private listeners;
|
|
6
|
-
constructor();
|
|
8
|
+
constructor(config: ChatConfig);
|
|
7
9
|
private connect;
|
|
8
10
|
emit(event: string, data?: any): void;
|
|
9
11
|
joinRoom(roomId: string): void;
|