@trixwell/ngx-parl 4.1.1 → 4.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -0
- package/fesm2022/trixwell-ngx-parl.mjs +45 -3
- package/fesm2022/trixwell-ngx-parl.mjs.map +1 -1
- package/index.d.ts +8 -2
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -27,6 +27,7 @@ class ChatMessage {
|
|
|
27
27
|
file_list;
|
|
28
28
|
checked;
|
|
29
29
|
edit = false;
|
|
30
|
+
pending = false;
|
|
30
31
|
constructor(data) {
|
|
31
32
|
this.id = data.id;
|
|
32
33
|
this.chat_id = data.chat_id;
|
|
@@ -38,6 +39,7 @@ class ChatMessage {
|
|
|
38
39
|
this.content = data.content;
|
|
39
40
|
this.avatar = data.avatar ?? null;
|
|
40
41
|
this.checked = data.checked ?? null;
|
|
42
|
+
this.pending = data.pending ?? false;
|
|
41
43
|
this.file_path = data.file_path ?? null;
|
|
42
44
|
this.file_list = data.file_list ?? null;
|
|
43
45
|
}
|
|
@@ -363,7 +365,7 @@ class ChatMessageComponent {
|
|
|
363
365
|
}
|
|
364
366
|
messageType = MessageType;
|
|
365
367
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: ChatMessageComponent, deps: [{ token: UtilsService }], target: i0.ɵɵFactoryTarget.Component });
|
|
366
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.16", type: ChatMessageComponent, isStandalone: true, selector: "lib-chat-message", inputs: { currentMessage: { classPropertyName: "currentMessage", publicName: "currentMessage", isSignal: true, isRequired: true, transformFunction: null }, edit: { classPropertyName: "edit", publicName: "edit", isSignal: true, isRequired: false, transformFunction: null }, previewList: { classPropertyName: "previewList", publicName: "previewList", isSignal: true, isRequired: false, transformFunction: null }, previewIndex: { classPropertyName: "previewIndex", publicName: "previewIndex", isSignal: true, isRequired: false, transformFunction: null }, previewOpener: { classPropertyName: "previewOpener", publicName: "previewOpener", isSignal: true, isRequired: false, transformFunction: null }, requestEdit: { classPropertyName: "requestEdit", publicName: "requestEdit", isSignal: true, isRequired: false, transformFunction: null }, requestDelete: { classPropertyName: "requestDelete", publicName: "requestDelete", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { edit: "editChange", previewList: "previewListChange", previewIndex: "previewIndexChange", previewOpener: "previewOpenerChange", requestEdit: "requestEditChange", requestDelete: "requestDeleteChange" }, ngImport: i0, template: "<div class=\"message\"\n [ngClass]=\"{\n 'message--outgoing': currentMessage().type === messageType.Outgoing,\n 'message--incoming': currentMessage().type === messageType.Incoming\n }\">\n <div class=\"message__avatar\">\n <img [ngSrc]=\"avatarSrc()\" width=\"36\" height=\"36\" alt=\"avatar\"/>\n </div>\n\n <div class=\"message__body\"\n [class.message__body--attachments-1]=\"attachments().length === 1\"\n [class.message__body--attachments-2]=\"attachments().length === 2\"\n [class.message__body--attachments-3]=\"attachments().length >= 3\"\n (contextmenu)=\"openContextMenu($event, menuTrigger, menuTriggerEl)\"\n (keydown.shift.F10)=\"$event.preventDefault(); menuTrigger.openMenu()\">\n <button type=\"button\"\n class=\"message__menu-trigger\"\n aria-hidden=\"true\"\n tabindex=\"-1\"\n #menuTrigger=\"matMenuTrigger\"\n #menuTriggerEl\n [matMenuTriggerFor]=\"messageMenu\"\n >\n </button>\n\n @if (attachments().length) {\n <div class=\"message__attachments\">\n @for (file of attachments(); track file; let i = $index) {\n <button type=\"button\"\n class=\"message__image-button\"\n (click)=\"openPreview(i, $event)\"\n [attr.aria-label]=\"'chat.photo_preview' | transloco\">\n <img [src]=\"file\"\n alt=\"attachment\"\n class=\"message__image\"\n loading=\"lazy\"/>\n </button>\n }\n </div>\n }\n\n <div class=\"message__bubble\" tabindex=\"0\">\n <div class=\"message__text\">{{ currentMessage().content }}</div>\n\n <div class=\"message__meta\">\n <time class=\"message__time\">\n {{ currentMessage().cr_time | date:'HH:mm' }}\n </time>\n @if (currentMessage().type === messageType.Outgoing) {\n @if (currentMessage().checked) {\n <img ngSrc=\"assets/ngx-parl/icons/checked-message.svg\"\n class=\"message__icon\"\n width=\"18\" height=\"18\" alt=\"hide\"/>\n } @else {\n <img ngSrc=\"assets/ngx-parl/icons/no-check.svg\"\n class=\"message__icon\"\n width=\"18\" height=\"18\" alt=\"hide\"/>\n }\n }\n </div>\n </div>\n </div>\n</div>\n<div class=\"message__user\">\n @if (currentMessage().type === messageType.Outgoing) {\n <span class=\"message__user-name\">{{ currentMessage().user }}</span>\n }\n</div>\n\n@if (previewList().length) {\n <lib-preview-file\n [srcList]=\"previewList()\"\n [startIndex]=\"previewIndex()\"\n [openerElement]=\"previewOpener()\"\n [closeHandler]=\"closePreviewHandler\">\n </lib-preview-file>\n}\n\n<mat-menu #messageMenu=\"matMenu\" yPosition=\"below\" xPosition=\"before\" class=\"message__menu\">\n @if (currentMessage().type === messageType.Outgoing) {\n <button mat-menu-item (click)=\"editMessage(currentMessage())\">\n <img ngSrc=\"assets/ngx-parl/icons/icon-edit.svg\"\n class=\"message__icon--menu\"\n width=\"20\" height=\"20\" alt=\"hide\"/>\n <span>{{ 'chat.edit' | transloco }}</span>\n </button>\n }\n @if (canDelete(currentMessage())) {\n <button mat-menu-item (click)=\"deleteMessage(currentMessage())\">\n <img ngSrc=\"assets/ngx-parl/icons/trash.svg\"\n class=\"message__icon--menu\"\n width=\"20\" height=\"20\" alt=\"hide\"/>\n <span>{{ 'chat.remove' | transloco }}</span>\n </button>\n }\n</mat-menu>\n", styles: [".flow-theme-primary ::ng-deep .modal-chat__header{background-color:#5a72d7;color:#fff}.flow-theme-primary ::ng-deep .message--incoming .message__body{background:#e9ecef;color:#343a40}.flow-theme-primary ::ng-deep .message--outgoing .message__body{background:#4656ca;color:#fff}:root{--shadow-sm: 0px 1px 2px 0px rgba(0, 0, 0, .05);--shadow-md: 0px 4px 12px rgba(0, 0, 0, .08);--shadow-lg: 0px 8px 24px rgba(0, 0, 0, .12);--shadow-soft: 0px 0px 6px 0px rgba(46, 46, 46, .12) }.flow-theme-secondary ::ng-deep .modal-chat__header{background-color:#848af5;color:#fefefe}.flow-theme-secondary ::ng-deep .message--incoming .message__body{background:#848af5;color:#fefefe}.flow-theme-secondary ::ng-deep .message--outgoing .message__body{background:#efefef;color:#464646}.message{display:flex;gap:8px;align-items:flex-end;max-width:80%;animation:pop .12s ease-out}.message__avatar img{display:block;border-radius:1000px}.message__body{padding:8px 12px;min-width:0;font:400 16px/20px inter,sans-serif;border-radius:16px;position:relative}.message__bubble{display:grid;grid-template-columns:1fr auto;column-gap:8px;align-items:end;max-width:100%;word-break:break-word;white-space:pre-wrap}.message__text{min-width:0}.message__meta{display:inline-flex;align-items:center;gap:4px;-webkit-user-select:none;user-select:none;line-height:1;margin:0}.message__time{font:400 12px/16px inter,sans-serif}.message__attachments{display:grid;gap:8px;justify-content:start;width:100%;margin-bottom:8px}.message__attachments:has(:only-child){grid-template-columns:repeat(1,minmax(0,140px))}.message__attachments:has(:nth-child(2):last-child){grid-template-columns:repeat(2,minmax(0,145px))}.message__attachments:has(:nth-child(3)){grid-template-columns:repeat(3,minmax(0,150px))}.message__body--attachments-1{max-width:164px}.message__body--attachments-2{max-width:312px}.message__body--attachments-3{max-width:460px}.message__body--attachments-1 .message__bubble,.message__body--attachments-2 .message__bubble,.message__body--attachments-3 .message__bubble{grid-template-columns:1fr;row-gap:4px}.message__body--attachments-1 .message__meta,.message__body--attachments-2 .message__meta,.message__body--attachments-3 .message__meta{justify-self:end}.message__image-button{display:block;border:none;padding:0;background:transparent;border-radius:12px;overflow:hidden;cursor:pointer}.message__image-button:focus-visible{outline:2px solid #5A72D7;outline-offset:4px}.message__menu-trigger{position:fixed;left:-9999px;top:-9999px;width:1px;height:1px;opacity:0;pointer-events:none}.message__image{display:block;width:100%;height:140px;object-fit:cover;border-radius:12px;aspect-ratio:1/1}.message__bubble:after{content:\"\";display:block;clear:both}.message__time{font:400 12px/16px inter,sans-serif;min-width:30px}.message__icon{width:14px;height:14px;vertical-align:middle}.message__icon--menu{width:20px;height:20px}.message--incoming{margin-right:auto}.message--incoming .message__body{border-bottom-right-radius:16px}.message--incoming .message__bubble{border-top-left-radius:4px}.message--incoming .message__time{color:#adb5bd}.message--outgoing{margin-left:auto;flex-direction:row-reverse}.message--outgoing .message__body{border-bottom-left-radius:16px}.message--outgoing .message__bubble{border-top-right-radius:4px}.message--outgoing .message__time{color:#e9ecef}.message--outgoing .message__menu-trigger{right:auto}.message__user{display:flex;justify-content:flex-end;max-width:80%;margin-left:auto;margin-top:4px;padding-right:46px}.message__user-name{font:400 12px/16px inter,sans-serif;color:#ced4da}@keyframes pop{0%{transform:translateY(2px);opacity:0}to{transform:translateY(0);opacity:1}}::ng-deep .mat-mdc-menu-content{background:#fff;width:160px;border-radius:8px;gap:4px;border:1px solid #E1E7F8;padding:8px 4px;box-shadow:0 2px 4px #0000001a;overflow:hidden;font:400 14px/18px inter,sans-serif}::ng-deep .mat-mdc-menu-item-text{font:400 14px/18px inter,sans-serif!important;font-weight:500!important;color:#343a40!important;display:flex;justify-content:flex-start;align-items:center;gap:4px}\n"], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgOptimizedImage, selector: "img[ngSrc]", inputs: ["ngSrc", "ngSrcset", "sizes", "width", "height", "decoding", "loading", "priority", "loaderParams", "disableOptimizedSrcset", "fill", "placeholder", "placeholderConfig", "src", "srcset"] }, { kind: "component", type: MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "component", type: PreviewFile, selector: "lib-preview-file", inputs: ["srcList", "startIndex", "title", "openerElement", "closeHandler", "activeIndex", "viewReady", "userNavigated", "previousListLength"], outputs: ["activeIndexChange", "viewReadyChange", "userNavigatedChange", "previousListLengthChange"] }, { kind: "pipe", type: DatePipe, name: "date" }, { kind: "pipe", type: TranslocoPipe, name: "transloco" }] });
|
|
368
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.16", type: ChatMessageComponent, isStandalone: true, selector: "lib-chat-message", inputs: { currentMessage: { classPropertyName: "currentMessage", publicName: "currentMessage", isSignal: true, isRequired: true, transformFunction: null }, edit: { classPropertyName: "edit", publicName: "edit", isSignal: true, isRequired: false, transformFunction: null }, previewList: { classPropertyName: "previewList", publicName: "previewList", isSignal: true, isRequired: false, transformFunction: null }, previewIndex: { classPropertyName: "previewIndex", publicName: "previewIndex", isSignal: true, isRequired: false, transformFunction: null }, previewOpener: { classPropertyName: "previewOpener", publicName: "previewOpener", isSignal: true, isRequired: false, transformFunction: null }, requestEdit: { classPropertyName: "requestEdit", publicName: "requestEdit", isSignal: true, isRequired: false, transformFunction: null }, requestDelete: { classPropertyName: "requestDelete", publicName: "requestDelete", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { edit: "editChange", previewList: "previewListChange", previewIndex: "previewIndexChange", previewOpener: "previewOpenerChange", requestEdit: "requestEditChange", requestDelete: "requestDeleteChange" }, ngImport: i0, template: "<div class=\"message\"\n [ngClass]=\"{\n 'message--outgoing': currentMessage().type === messageType.Outgoing,\n 'message--incoming': currentMessage().type === messageType.Incoming\n }\">\n <div class=\"message__avatar\">\n <img [ngSrc]=\"avatarSrc()\" width=\"36\" height=\"36\" alt=\"avatar\"/>\n </div>\n\n <div class=\"message__body\"\n [class.message__body--attachments-1]=\"attachments().length === 1\"\n [class.message__body--attachments-2]=\"attachments().length === 2\"\n [class.message__body--attachments-3]=\"attachments().length >= 3\"\n (contextmenu)=\"openContextMenu($event, menuTrigger, menuTriggerEl)\"\n (keydown.shift.F10)=\"$event.preventDefault(); menuTrigger.openMenu()\">\n <button type=\"button\"\n class=\"message__menu-trigger\"\n aria-hidden=\"true\"\n tabindex=\"-1\"\n #menuTrigger=\"matMenuTrigger\"\n #menuTriggerEl\n [matMenuTriggerFor]=\"messageMenu\"\n >\n </button>\n\n @if (attachments().length) {\n <div class=\"message__attachments\">\n @for (file of attachments(); track file; let i = $index) {\n <button type=\"button\"\n class=\"message__image-button\"\n (click)=\"openPreview(i, $event)\"\n [attr.aria-label]=\"'chat.photo_preview' | transloco\">\n <img [src]=\"file\"\n alt=\"attachment\"\n class=\"message__image\"\n loading=\"lazy\"/>\n </button>\n }\n </div>\n }\n\n <div class=\"message__bubble\" tabindex=\"0\">\n <div class=\"message__text\">{{ currentMessage().content }}</div>\n\n <div class=\"message__meta\">\n <time class=\"message__time\">\n {{ currentMessage().cr_time | date:'HH:mm' }}\n </time>\n @if (currentMessage().type === messageType.Outgoing) {\n @if (currentMessage().pending) {\n <span class=\"message__loading\" aria-label=\"Sending\"></span>\n } @else if (currentMessage().checked) {\n <img ngSrc=\"assets/ngx-parl/icons/checked-message.svg\"\n class=\"message__icon\"\n width=\"18\" height=\"18\" alt=\"hide\"/>\n } @else {\n <img ngSrc=\"assets/ngx-parl/icons/no-check.svg\"\n class=\"message__icon\"\n width=\"18\" height=\"18\" alt=\"hide\"/>\n }\n }\n </div>\n </div>\n </div>\n</div>\n<div class=\"message__user\">\n @if (currentMessage().type === messageType.Outgoing) {\n <span class=\"message__user-name\">{{ currentMessage().user }}</span>\n }\n</div>\n\n@if (previewList().length) {\n <lib-preview-file\n [srcList]=\"previewList()\"\n [startIndex]=\"previewIndex()\"\n [openerElement]=\"previewOpener()\"\n [closeHandler]=\"closePreviewHandler\">\n </lib-preview-file>\n}\n\n<mat-menu #messageMenu=\"matMenu\" yPosition=\"below\" xPosition=\"before\" class=\"message__menu\">\n @if (currentMessage().type === messageType.Outgoing) {\n <button mat-menu-item (click)=\"editMessage(currentMessage())\">\n <img ngSrc=\"assets/ngx-parl/icons/icon-edit.svg\"\n class=\"message__icon--menu\"\n width=\"20\" height=\"20\" alt=\"hide\"/>\n <span>{{ 'chat.edit' | transloco }}</span>\n </button>\n }\n @if (canDelete(currentMessage())) {\n <button mat-menu-item (click)=\"deleteMessage(currentMessage())\">\n <img ngSrc=\"assets/ngx-parl/icons/trash.svg\"\n class=\"message__icon--menu\"\n width=\"20\" height=\"20\" alt=\"hide\"/>\n <span>{{ 'chat.remove' | transloco }}</span>\n </button>\n }\n</mat-menu>\n", styles: [".flow-theme-primary ::ng-deep .modal-chat__header{background-color:#5a72d7;color:#fff}.flow-theme-primary ::ng-deep .message--incoming .message__body{background:#e9ecef;color:#343a40}.flow-theme-primary ::ng-deep .message--outgoing .message__body{background:#4656ca;color:#fff}:root{--shadow-sm: 0px 1px 2px 0px rgba(0, 0, 0, .05);--shadow-md: 0px 4px 12px rgba(0, 0, 0, .08);--shadow-lg: 0px 8px 24px rgba(0, 0, 0, .12);--shadow-soft: 0px 0px 6px 0px rgba(46, 46, 46, .12) }.flow-theme-secondary ::ng-deep .modal-chat__header{background-color:#848af5;color:#fefefe}.flow-theme-secondary ::ng-deep .message--incoming .message__body{background:#848af5;color:#fefefe}.flow-theme-secondary ::ng-deep .message--outgoing .message__body{background:#efefef;color:#464646}.message{display:flex;gap:8px;align-items:flex-end;max-width:80%;animation:pop .12s ease-out}.message__avatar img{display:block;border-radius:1000px}.message__body{padding:8px 12px;min-width:0;font:400 16px/20px inter,sans-serif;border-radius:16px;position:relative}.message__bubble{display:grid;grid-template-columns:1fr auto;column-gap:8px;align-items:end;max-width:100%;word-break:break-word;white-space:pre-wrap}.message__text{min-width:0}.message__meta{display:inline-flex;align-items:center;gap:4px;-webkit-user-select:none;user-select:none;line-height:1;margin:0}.message__time{font:400 12px/16px inter,sans-serif}.message__attachments{display:grid;gap:8px;justify-content:start;width:100%;margin-bottom:8px}.message__attachments:has(:only-child){grid-template-columns:repeat(1,minmax(0,140px))}.message__attachments:has(:nth-child(2):last-child){grid-template-columns:repeat(2,minmax(0,145px))}.message__attachments:has(:nth-child(3)){grid-template-columns:repeat(3,minmax(0,150px))}.message__body--attachments-1{max-width:164px}.message__body--attachments-2{max-width:312px}.message__body--attachments-3{max-width:460px}.message__body--attachments-1 .message__bubble,.message__body--attachments-2 .message__bubble,.message__body--attachments-3 .message__bubble{grid-template-columns:1fr;row-gap:4px}.message__body--attachments-1 .message__meta,.message__body--attachments-2 .message__meta,.message__body--attachments-3 .message__meta{justify-self:end}.message__image-button{display:block;border:none;padding:0;background:transparent;border-radius:12px;overflow:hidden;cursor:pointer}.message__image-button:focus-visible{outline:2px solid #5A72D7;outline-offset:4px}.message__menu-trigger{position:fixed;left:-9999px;top:-9999px;width:1px;height:1px;opacity:0;pointer-events:none}.message__image{display:block;width:100%;height:140px;object-fit:cover;border-radius:12px;aspect-ratio:1/1}.message__bubble:after{content:\"\";display:block;clear:both}.message__time{font:400 12px/16px inter,sans-serif;min-width:30px}.message__icon{width:14px;height:14px;vertical-align:middle}.message__icon--menu{width:20px;height:20px}.message__loading{display:inline-block;width:10px;height:10px;border:2px solid #E9ECEF;border-top-color:#5a72d7;border-radius:50%;animation:message-loading-spin .8s linear infinite}.message--incoming{margin-right:auto}.message--incoming .message__body{border-bottom-right-radius:16px}.message--incoming .message__bubble{border-top-left-radius:4px}.message--incoming .message__time{color:#adb5bd}.message--outgoing{margin-left:auto;flex-direction:row-reverse}.message--outgoing .message__body{border-bottom-left-radius:16px}.message--outgoing .message__bubble{border-top-right-radius:4px}.message--outgoing .message__time{color:#e9ecef}.message--outgoing .message__menu-trigger{right:auto}.message__user{display:flex;justify-content:flex-end;max-width:80%;margin-left:auto;margin-top:4px;padding-right:46px}.message__user-name{font:400 12px/16px inter,sans-serif;color:#ced4da}@keyframes pop{0%{transform:translateY(2px);opacity:0}to{transform:translateY(0);opacity:1}}@keyframes message-loading-spin{to{transform:rotate(360deg)}}::ng-deep .mat-mdc-menu-content{background:#fff;width:160px;border-radius:8px;gap:4px;border:1px solid #E1E7F8;padding:8px 4px;box-shadow:0 2px 4px #0000001a;overflow:hidden;font:400 14px/18px inter,sans-serif}::ng-deep .mat-mdc-menu-item-text{font:400 14px/18px inter,sans-serif!important;font-weight:500!important;color:#343a40!important;display:flex;justify-content:flex-start;align-items:center;gap:4px}\n"], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgOptimizedImage, selector: "img[ngSrc]", inputs: ["ngSrc", "ngSrcset", "sizes", "width", "height", "decoding", "loading", "priority", "loaderParams", "disableOptimizedSrcset", "fill", "placeholder", "placeholderConfig", "src", "srcset"] }, { kind: "component", type: MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "component", type: PreviewFile, selector: "lib-preview-file", inputs: ["srcList", "startIndex", "title", "openerElement", "closeHandler", "activeIndex", "viewReady", "userNavigated", "previousListLength"], outputs: ["activeIndexChange", "viewReadyChange", "userNavigatedChange", "previousListLengthChange"] }, { kind: "pipe", type: DatePipe, name: "date" }, { kind: "pipe", type: TranslocoPipe, name: "transloco" }] });
|
|
367
369
|
}
|
|
368
370
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: ChatMessageComponent, decorators: [{
|
|
369
371
|
type: Component,
|
|
@@ -376,7 +378,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
|
|
|
376
378
|
MatMenuTrigger,
|
|
377
379
|
TranslocoPipe,
|
|
378
380
|
PreviewFile,
|
|
379
|
-
], standalone: true, template: "<div class=\"message\"\n [ngClass]=\"{\n 'message--outgoing': currentMessage().type === messageType.Outgoing,\n 'message--incoming': currentMessage().type === messageType.Incoming\n }\">\n <div class=\"message__avatar\">\n <img [ngSrc]=\"avatarSrc()\" width=\"36\" height=\"36\" alt=\"avatar\"/>\n </div>\n\n <div class=\"message__body\"\n [class.message__body--attachments-1]=\"attachments().length === 1\"\n [class.message__body--attachments-2]=\"attachments().length === 2\"\n [class.message__body--attachments-3]=\"attachments().length >= 3\"\n (contextmenu)=\"openContextMenu($event, menuTrigger, menuTriggerEl)\"\n (keydown.shift.F10)=\"$event.preventDefault(); menuTrigger.openMenu()\">\n <button type=\"button\"\n class=\"message__menu-trigger\"\n aria-hidden=\"true\"\n tabindex=\"-1\"\n #menuTrigger=\"matMenuTrigger\"\n #menuTriggerEl\n [matMenuTriggerFor]=\"messageMenu\"\n >\n </button>\n\n @if (attachments().length) {\n <div class=\"message__attachments\">\n @for (file of attachments(); track file; let i = $index) {\n <button type=\"button\"\n class=\"message__image-button\"\n (click)=\"openPreview(i, $event)\"\n [attr.aria-label]=\"'chat.photo_preview' | transloco\">\n <img [src]=\"file\"\n alt=\"attachment\"\n class=\"message__image\"\n loading=\"lazy\"/>\n </button>\n }\n </div>\n }\n\n <div class=\"message__bubble\" tabindex=\"0\">\n <div class=\"message__text\">{{ currentMessage().content }}</div>\n\n <div class=\"message__meta\">\n <time class=\"message__time\">\n {{ currentMessage().cr_time | date:'HH:mm' }}\n </time>\n @if (currentMessage().type === messageType.Outgoing) {\n @if (currentMessage().checked) {\n <img ngSrc=\"assets/ngx-parl/icons/checked-message.svg\"\n class=\"message__icon\"\n width=\"18\" height=\"18\" alt=\"hide\"/>\n } @else {\n <img ngSrc=\"assets/ngx-parl/icons/no-check.svg\"\n class=\"message__icon\"\n width=\"18\" height=\"18\" alt=\"hide\"/>\n }\n }\n </div>\n </div>\n </div>\n</div>\n<div class=\"message__user\">\n @if (currentMessage().type === messageType.Outgoing) {\n <span class=\"message__user-name\">{{ currentMessage().user }}</span>\n }\n</div>\n\n@if (previewList().length) {\n <lib-preview-file\n [srcList]=\"previewList()\"\n [startIndex]=\"previewIndex()\"\n [openerElement]=\"previewOpener()\"\n [closeHandler]=\"closePreviewHandler\">\n </lib-preview-file>\n}\n\n<mat-menu #messageMenu=\"matMenu\" yPosition=\"below\" xPosition=\"before\" class=\"message__menu\">\n @if (currentMessage().type === messageType.Outgoing) {\n <button mat-menu-item (click)=\"editMessage(currentMessage())\">\n <img ngSrc=\"assets/ngx-parl/icons/icon-edit.svg\"\n class=\"message__icon--menu\"\n width=\"20\" height=\"20\" alt=\"hide\"/>\n <span>{{ 'chat.edit' | transloco }}</span>\n </button>\n }\n @if (canDelete(currentMessage())) {\n <button mat-menu-item (click)=\"deleteMessage(currentMessage())\">\n <img ngSrc=\"assets/ngx-parl/icons/trash.svg\"\n class=\"message__icon--menu\"\n width=\"20\" height=\"20\" alt=\"hide\"/>\n <span>{{ 'chat.remove' | transloco }}</span>\n </button>\n }\n</mat-menu>\n", styles: [".flow-theme-primary ::ng-deep .modal-chat__header{background-color:#5a72d7;color:#fff}.flow-theme-primary ::ng-deep .message--incoming .message__body{background:#e9ecef;color:#343a40}.flow-theme-primary ::ng-deep .message--outgoing .message__body{background:#4656ca;color:#fff}:root{--shadow-sm: 0px 1px 2px 0px rgba(0, 0, 0, .05);--shadow-md: 0px 4px 12px rgba(0, 0, 0, .08);--shadow-lg: 0px 8px 24px rgba(0, 0, 0, .12);--shadow-soft: 0px 0px 6px 0px rgba(46, 46, 46, .12) }.flow-theme-secondary ::ng-deep .modal-chat__header{background-color:#848af5;color:#fefefe}.flow-theme-secondary ::ng-deep .message--incoming .message__body{background:#848af5;color:#fefefe}.flow-theme-secondary ::ng-deep .message--outgoing .message__body{background:#efefef;color:#464646}.message{display:flex;gap:8px;align-items:flex-end;max-width:80%;animation:pop .12s ease-out}.message__avatar img{display:block;border-radius:1000px}.message__body{padding:8px 12px;min-width:0;font:400 16px/20px inter,sans-serif;border-radius:16px;position:relative}.message__bubble{display:grid;grid-template-columns:1fr auto;column-gap:8px;align-items:end;max-width:100%;word-break:break-word;white-space:pre-wrap}.message__text{min-width:0}.message__meta{display:inline-flex;align-items:center;gap:4px;-webkit-user-select:none;user-select:none;line-height:1;margin:0}.message__time{font:400 12px/16px inter,sans-serif}.message__attachments{display:grid;gap:8px;justify-content:start;width:100%;margin-bottom:8px}.message__attachments:has(:only-child){grid-template-columns:repeat(1,minmax(0,140px))}.message__attachments:has(:nth-child(2):last-child){grid-template-columns:repeat(2,minmax(0,145px))}.message__attachments:has(:nth-child(3)){grid-template-columns:repeat(3,minmax(0,150px))}.message__body--attachments-1{max-width:164px}.message__body--attachments-2{max-width:312px}.message__body--attachments-3{max-width:460px}.message__body--attachments-1 .message__bubble,.message__body--attachments-2 .message__bubble,.message__body--attachments-3 .message__bubble{grid-template-columns:1fr;row-gap:4px}.message__body--attachments-1 .message__meta,.message__body--attachments-2 .message__meta,.message__body--attachments-3 .message__meta{justify-self:end}.message__image-button{display:block;border:none;padding:0;background:transparent;border-radius:12px;overflow:hidden;cursor:pointer}.message__image-button:focus-visible{outline:2px solid #5A72D7;outline-offset:4px}.message__menu-trigger{position:fixed;left:-9999px;top:-9999px;width:1px;height:1px;opacity:0;pointer-events:none}.message__image{display:block;width:100%;height:140px;object-fit:cover;border-radius:12px;aspect-ratio:1/1}.message__bubble:after{content:\"\";display:block;clear:both}.message__time{font:400 12px/16px inter,sans-serif;min-width:30px}.message__icon{width:14px;height:14px;vertical-align:middle}.message__icon--menu{width:20px;height:20px}.message--incoming{margin-right:auto}.message--incoming .message__body{border-bottom-right-radius:16px}.message--incoming .message__bubble{border-top-left-radius:4px}.message--incoming .message__time{color:#adb5bd}.message--outgoing{margin-left:auto;flex-direction:row-reverse}.message--outgoing .message__body{border-bottom-left-radius:16px}.message--outgoing .message__bubble{border-top-right-radius:4px}.message--outgoing .message__time{color:#e9ecef}.message--outgoing .message__menu-trigger{right:auto}.message__user{display:flex;justify-content:flex-end;max-width:80%;margin-left:auto;margin-top:4px;padding-right:46px}.message__user-name{font:400 12px/16px inter,sans-serif;color:#ced4da}@keyframes pop{0%{transform:translateY(2px);opacity:0}to{transform:translateY(0);opacity:1}}::ng-deep .mat-mdc-menu-content{background:#fff;width:160px;border-radius:8px;gap:4px;border:1px solid #E1E7F8;padding:8px 4px;box-shadow:0 2px 4px #0000001a;overflow:hidden;font:400 14px/18px inter,sans-serif}::ng-deep .mat-mdc-menu-item-text{font:400 14px/18px inter,sans-serif!important;font-weight:500!important;color:#343a40!important;display:flex;justify-content:flex-start;align-items:center;gap:4px}\n"] }]
|
|
381
|
+
], standalone: true, template: "<div class=\"message\"\n [ngClass]=\"{\n 'message--outgoing': currentMessage().type === messageType.Outgoing,\n 'message--incoming': currentMessage().type === messageType.Incoming\n }\">\n <div class=\"message__avatar\">\n <img [ngSrc]=\"avatarSrc()\" width=\"36\" height=\"36\" alt=\"avatar\"/>\n </div>\n\n <div class=\"message__body\"\n [class.message__body--attachments-1]=\"attachments().length === 1\"\n [class.message__body--attachments-2]=\"attachments().length === 2\"\n [class.message__body--attachments-3]=\"attachments().length >= 3\"\n (contextmenu)=\"openContextMenu($event, menuTrigger, menuTriggerEl)\"\n (keydown.shift.F10)=\"$event.preventDefault(); menuTrigger.openMenu()\">\n <button type=\"button\"\n class=\"message__menu-trigger\"\n aria-hidden=\"true\"\n tabindex=\"-1\"\n #menuTrigger=\"matMenuTrigger\"\n #menuTriggerEl\n [matMenuTriggerFor]=\"messageMenu\"\n >\n </button>\n\n @if (attachments().length) {\n <div class=\"message__attachments\">\n @for (file of attachments(); track file; let i = $index) {\n <button type=\"button\"\n class=\"message__image-button\"\n (click)=\"openPreview(i, $event)\"\n [attr.aria-label]=\"'chat.photo_preview' | transloco\">\n <img [src]=\"file\"\n alt=\"attachment\"\n class=\"message__image\"\n loading=\"lazy\"/>\n </button>\n }\n </div>\n }\n\n <div class=\"message__bubble\" tabindex=\"0\">\n <div class=\"message__text\">{{ currentMessage().content }}</div>\n\n <div class=\"message__meta\">\n <time class=\"message__time\">\n {{ currentMessage().cr_time | date:'HH:mm' }}\n </time>\n @if (currentMessage().type === messageType.Outgoing) {\n @if (currentMessage().pending) {\n <span class=\"message__loading\" aria-label=\"Sending\"></span>\n } @else if (currentMessage().checked) {\n <img ngSrc=\"assets/ngx-parl/icons/checked-message.svg\"\n class=\"message__icon\"\n width=\"18\" height=\"18\" alt=\"hide\"/>\n } @else {\n <img ngSrc=\"assets/ngx-parl/icons/no-check.svg\"\n class=\"message__icon\"\n width=\"18\" height=\"18\" alt=\"hide\"/>\n }\n }\n </div>\n </div>\n </div>\n</div>\n<div class=\"message__user\">\n @if (currentMessage().type === messageType.Outgoing) {\n <span class=\"message__user-name\">{{ currentMessage().user }}</span>\n }\n</div>\n\n@if (previewList().length) {\n <lib-preview-file\n [srcList]=\"previewList()\"\n [startIndex]=\"previewIndex()\"\n [openerElement]=\"previewOpener()\"\n [closeHandler]=\"closePreviewHandler\">\n </lib-preview-file>\n}\n\n<mat-menu #messageMenu=\"matMenu\" yPosition=\"below\" xPosition=\"before\" class=\"message__menu\">\n @if (currentMessage().type === messageType.Outgoing) {\n <button mat-menu-item (click)=\"editMessage(currentMessage())\">\n <img ngSrc=\"assets/ngx-parl/icons/icon-edit.svg\"\n class=\"message__icon--menu\"\n width=\"20\" height=\"20\" alt=\"hide\"/>\n <span>{{ 'chat.edit' | transloco }}</span>\n </button>\n }\n @if (canDelete(currentMessage())) {\n <button mat-menu-item (click)=\"deleteMessage(currentMessage())\">\n <img ngSrc=\"assets/ngx-parl/icons/trash.svg\"\n class=\"message__icon--menu\"\n width=\"20\" height=\"20\" alt=\"hide\"/>\n <span>{{ 'chat.remove' | transloco }}</span>\n </button>\n }\n</mat-menu>\n", styles: [".flow-theme-primary ::ng-deep .modal-chat__header{background-color:#5a72d7;color:#fff}.flow-theme-primary ::ng-deep .message--incoming .message__body{background:#e9ecef;color:#343a40}.flow-theme-primary ::ng-deep .message--outgoing .message__body{background:#4656ca;color:#fff}:root{--shadow-sm: 0px 1px 2px 0px rgba(0, 0, 0, .05);--shadow-md: 0px 4px 12px rgba(0, 0, 0, .08);--shadow-lg: 0px 8px 24px rgba(0, 0, 0, .12);--shadow-soft: 0px 0px 6px 0px rgba(46, 46, 46, .12) }.flow-theme-secondary ::ng-deep .modal-chat__header{background-color:#848af5;color:#fefefe}.flow-theme-secondary ::ng-deep .message--incoming .message__body{background:#848af5;color:#fefefe}.flow-theme-secondary ::ng-deep .message--outgoing .message__body{background:#efefef;color:#464646}.message{display:flex;gap:8px;align-items:flex-end;max-width:80%;animation:pop .12s ease-out}.message__avatar img{display:block;border-radius:1000px}.message__body{padding:8px 12px;min-width:0;font:400 16px/20px inter,sans-serif;border-radius:16px;position:relative}.message__bubble{display:grid;grid-template-columns:1fr auto;column-gap:8px;align-items:end;max-width:100%;word-break:break-word;white-space:pre-wrap}.message__text{min-width:0}.message__meta{display:inline-flex;align-items:center;gap:4px;-webkit-user-select:none;user-select:none;line-height:1;margin:0}.message__time{font:400 12px/16px inter,sans-serif}.message__attachments{display:grid;gap:8px;justify-content:start;width:100%;margin-bottom:8px}.message__attachments:has(:only-child){grid-template-columns:repeat(1,minmax(0,140px))}.message__attachments:has(:nth-child(2):last-child){grid-template-columns:repeat(2,minmax(0,145px))}.message__attachments:has(:nth-child(3)){grid-template-columns:repeat(3,minmax(0,150px))}.message__body--attachments-1{max-width:164px}.message__body--attachments-2{max-width:312px}.message__body--attachments-3{max-width:460px}.message__body--attachments-1 .message__bubble,.message__body--attachments-2 .message__bubble,.message__body--attachments-3 .message__bubble{grid-template-columns:1fr;row-gap:4px}.message__body--attachments-1 .message__meta,.message__body--attachments-2 .message__meta,.message__body--attachments-3 .message__meta{justify-self:end}.message__image-button{display:block;border:none;padding:0;background:transparent;border-radius:12px;overflow:hidden;cursor:pointer}.message__image-button:focus-visible{outline:2px solid #5A72D7;outline-offset:4px}.message__menu-trigger{position:fixed;left:-9999px;top:-9999px;width:1px;height:1px;opacity:0;pointer-events:none}.message__image{display:block;width:100%;height:140px;object-fit:cover;border-radius:12px;aspect-ratio:1/1}.message__bubble:after{content:\"\";display:block;clear:both}.message__time{font:400 12px/16px inter,sans-serif;min-width:30px}.message__icon{width:14px;height:14px;vertical-align:middle}.message__icon--menu{width:20px;height:20px}.message__loading{display:inline-block;width:10px;height:10px;border:2px solid #E9ECEF;border-top-color:#5a72d7;border-radius:50%;animation:message-loading-spin .8s linear infinite}.message--incoming{margin-right:auto}.message--incoming .message__body{border-bottom-right-radius:16px}.message--incoming .message__bubble{border-top-left-radius:4px}.message--incoming .message__time{color:#adb5bd}.message--outgoing{margin-left:auto;flex-direction:row-reverse}.message--outgoing .message__body{border-bottom-left-radius:16px}.message--outgoing .message__bubble{border-top-right-radius:4px}.message--outgoing .message__time{color:#e9ecef}.message--outgoing .message__menu-trigger{right:auto}.message__user{display:flex;justify-content:flex-end;max-width:80%;margin-left:auto;margin-top:4px;padding-right:46px}.message__user-name{font:400 12px/16px inter,sans-serif;color:#ced4da}@keyframes pop{0%{transform:translateY(2px);opacity:0}to{transform:translateY(0);opacity:1}}@keyframes message-loading-spin{to{transform:rotate(360deg)}}::ng-deep .mat-mdc-menu-content{background:#fff;width:160px;border-radius:8px;gap:4px;border:1px solid #E1E7F8;padding:8px 4px;box-shadow:0 2px 4px #0000001a;overflow:hidden;font:400 14px/18px inter,sans-serif}::ng-deep .mat-mdc-menu-item-text{font:400 14px/18px inter,sans-serif!important;font-weight:500!important;color:#343a40!important;display:flex;justify-content:flex-start;align-items:center;gap:4px}\n"] }]
|
|
380
382
|
}], ctorParameters: () => [{ type: UtilsService }], propDecorators: { currentMessage: [{ type: i0.Input, args: [{ isSignal: true, alias: "currentMessage", required: true }] }], edit: [{ type: i0.Input, args: [{ isSignal: true, alias: "edit", required: false }] }, { type: i0.Output, args: ["editChange"] }], previewList: [{ type: i0.Input, args: [{ isSignal: true, alias: "previewList", required: false }] }, { type: i0.Output, args: ["previewListChange"] }], previewIndex: [{ type: i0.Input, args: [{ isSignal: true, alias: "previewIndex", required: false }] }, { type: i0.Output, args: ["previewIndexChange"] }], previewOpener: [{ type: i0.Input, args: [{ isSignal: true, alias: "previewOpener", required: false }] }, { type: i0.Output, args: ["previewOpenerChange"] }], requestEdit: [{ type: i0.Input, args: [{ isSignal: true, alias: "requestEdit", required: false }] }, { type: i0.Output, args: ["requestEditChange"] }], requestDelete: [{ type: i0.Input, args: [{ isSignal: true, alias: "requestDelete", required: false }] }, { type: i0.Output, args: ["requestDeleteChange"] }] } });
|
|
381
383
|
|
|
382
384
|
class ToggleDisplayChatStartDayPipe {
|
|
@@ -450,6 +452,7 @@ class ChatFlowComponent {
|
|
|
450
452
|
previousScrollHeight = 0;
|
|
451
453
|
previousScrollTop = 0;
|
|
452
454
|
isUserAtBottom = true;
|
|
455
|
+
resizeObserver = null;
|
|
453
456
|
showScrollToBottom = signal(false, ...(ngDevMode ? [{ debugName: "showScrollToBottom" }] : []));
|
|
454
457
|
historyLoadThreshold = signal(1, ...(ngDevMode ? [{ debugName: "historyLoadThreshold" }] : []));
|
|
455
458
|
constructor() {
|
|
@@ -464,6 +467,7 @@ class ChatFlowComponent {
|
|
|
464
467
|
return;
|
|
465
468
|
}
|
|
466
469
|
const hasMoreMessages = messages.length > this.previousMessageCount;
|
|
470
|
+
const hasFewerMessages = messages.length < this.previousMessageCount;
|
|
467
471
|
const hasPrependedMessages = hasMoreMessages &&
|
|
468
472
|
this.previousFirstMessageId !== null &&
|
|
469
473
|
firstMessageId !== this.previousFirstMessageId;
|
|
@@ -483,6 +487,10 @@ class ChatFlowComponent {
|
|
|
483
487
|
if (hasMoreMessages && hasAppendedMessages && !hasPrependedMessages) {
|
|
484
488
|
this.pendingHistoryRestore = false;
|
|
485
489
|
}
|
|
490
|
+
if (hasFewerMessages) {
|
|
491
|
+
this.pendingHistoryRestore = true;
|
|
492
|
+
queueMicrotask(() => this.loadHistory.set(true));
|
|
493
|
+
}
|
|
486
494
|
this.previousMessageCount = messages.length;
|
|
487
495
|
this.previousFirstMessageId = firstMessageId;
|
|
488
496
|
this.previousLastMessageId = lastMessageId;
|
|
@@ -509,6 +517,7 @@ class ChatFlowComponent {
|
|
|
509
517
|
this.showScrollToBottom.set(!this.isUserAtBottom);
|
|
510
518
|
});
|
|
511
519
|
queueMicrotask(() => this.scrollToBottom());
|
|
520
|
+
this.observeScrollContainerForEmptySpace(element);
|
|
512
521
|
}
|
|
513
522
|
onScrollUp() {
|
|
514
523
|
this.pendingHistoryRestore = true;
|
|
@@ -556,6 +565,24 @@ class ChatFlowComponent {
|
|
|
556
565
|
this.showScrollToBottom.set(false);
|
|
557
566
|
return this;
|
|
558
567
|
}
|
|
568
|
+
observeScrollContainerForEmptySpace(element) {
|
|
569
|
+
const checkAndLoadIfNeeded = () => {
|
|
570
|
+
if (this.messageList().length > 0 &&
|
|
571
|
+
element.scrollHeight <= element.clientHeight + 10 &&
|
|
572
|
+
!this.loadHistory()) {
|
|
573
|
+
this.pendingHistoryRestore = true;
|
|
574
|
+
this.loadHistory.set(true);
|
|
575
|
+
}
|
|
576
|
+
};
|
|
577
|
+
this.resizeObserver = new ResizeObserver(() => {
|
|
578
|
+
requestAnimationFrame(checkAndLoadIfNeeded);
|
|
579
|
+
});
|
|
580
|
+
this.resizeObserver.observe(element);
|
|
581
|
+
}
|
|
582
|
+
ngOnDestroy() {
|
|
583
|
+
this.resizeObserver?.disconnect();
|
|
584
|
+
this.resizeObserver = null;
|
|
585
|
+
}
|
|
559
586
|
startEdit(message) {
|
|
560
587
|
this.messageList().forEach(current => {
|
|
561
588
|
if (current.id !== message.id && current.edit) {
|
|
@@ -683,6 +710,7 @@ class InputMessageComponent {
|
|
|
683
710
|
this.autoResizeByRows();
|
|
684
711
|
element.focus();
|
|
685
712
|
this.focused.set(true);
|
|
713
|
+
this.setCaretToEnd(element);
|
|
686
714
|
});
|
|
687
715
|
}
|
|
688
716
|
});
|
|
@@ -752,6 +780,16 @@ class InputMessageComponent {
|
|
|
752
780
|
});
|
|
753
781
|
return this;
|
|
754
782
|
}
|
|
783
|
+
setCaretToEnd(element) {
|
|
784
|
+
const range = document.createRange();
|
|
785
|
+
const selection = window.getSelection();
|
|
786
|
+
if (!selection)
|
|
787
|
+
return;
|
|
788
|
+
range.selectNodeContents(element);
|
|
789
|
+
range.collapse(false);
|
|
790
|
+
selection.removeAllRanges();
|
|
791
|
+
selection.addRange(range);
|
|
792
|
+
}
|
|
755
793
|
enterDown() {
|
|
756
794
|
const element = this.inputTextElement.nativeElement;
|
|
757
795
|
const text = this.draft().trim();
|
|
@@ -1116,11 +1154,13 @@ class NgxParlComponent {
|
|
|
1116
1154
|
if (messageId == null) {
|
|
1117
1155
|
return this;
|
|
1118
1156
|
}
|
|
1157
|
+
const message = this.messageList().find(m => m.id === messageId);
|
|
1158
|
+
const content = message?.content ?? '';
|
|
1119
1159
|
this.messageList.update(list => list.filter(m => m.id !== messageId));
|
|
1120
1160
|
this.pushMessageAction({
|
|
1121
1161
|
action: 'delete',
|
|
1122
1162
|
chatMessageId: messageId,
|
|
1123
|
-
content
|
|
1163
|
+
content,
|
|
1124
1164
|
});
|
|
1125
1165
|
return this;
|
|
1126
1166
|
}
|
|
@@ -1189,6 +1229,7 @@ class NgxParlComponent {
|
|
|
1189
1229
|
file_path: [],
|
|
1190
1230
|
file_list: [],
|
|
1191
1231
|
checked: true,
|
|
1232
|
+
pending: true,
|
|
1192
1233
|
};
|
|
1193
1234
|
this.messageList.update((list) => [...list, new ChatMessage(dto)]);
|
|
1194
1235
|
this.scrollToBottomTrigger.update(v => v + 1);
|
|
@@ -1235,6 +1276,7 @@ class NgxParlComponent {
|
|
|
1235
1276
|
file_path: hasFiles ? file_path : [],
|
|
1236
1277
|
file_list: hasFileList ? file_list : [],
|
|
1237
1278
|
checked: true,
|
|
1279
|
+
pending: true,
|
|
1238
1280
|
};
|
|
1239
1281
|
this.messageList.update((list) => [...list, new ChatMessage(dto)]);
|
|
1240
1282
|
this.scrollToBottomTrigger.update(v => v + 1);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"trixwell-ngx-parl.mjs","sources":["../../../projects/ngx-parl/src/lib/core/entity/chat.ts","../../../projects/ngx-parl/src/lib/core/components/preview-file/preview-file.ts","../../../projects/ngx-parl/src/lib/core/components/preview-file/preview-file.html","../../../projects/ngx-parl/src/lib/core/service/utils/utils.ts","../../../projects/ngx-parl/src/lib/core/components/chat-message/chat-message.ts","../../../projects/ngx-parl/src/lib/core/components/chat-message/chat-message.html","../../../projects/ngx-parl/src/lib/core/pipes/toggle-display-chat-start-day-pipe.ts","../../../projects/ngx-parl/src/lib/core/pipes/chat-start-day-pipe.ts","../../../projects/ngx-parl/src/lib/chat-flow/chat-flow.ts","../../../projects/ngx-parl/src/lib/chat-flow/chat-flow.html","../../../projects/ngx-parl/src/lib/core/entity/file.ts","../../../projects/ngx-parl/src/lib/input-message/input-message.ts","../../../projects/ngx-parl/src/lib/input-message/input-message.html","../../../projects/ngx-parl/src/lib/core/entity/theme.ts","../../../projects/ngx-parl/src/lib/ngx-parl/ngx-parl.ts","../../../projects/ngx-parl/src/lib/ngx-parl/ngx-parl.html","../../../projects/ngx-parl/src/assets/i18n/parl-transloco.loader.ts","../../../projects/ngx-parl/src/lib/ngx-parl.providers.ts","../../../projects/ngx-parl/src/trixwell-ngx-parl.ts"],"sourcesContent":["export class ChatMessage {\n public id: number;\n public chat_id: number;\n public cr_time: string;\n public type: ChatMessageType;\n public transport_type: string | null;\n public transport_type_icon: string | null;\n public user: string;\n public content: string;\n public avatar: string | null;\n public file_path: string[] | null;\n public file_list: File[] | null;\n\n public checked: boolean | null;\n public edit = false;\n\n constructor(data: ChatMessageDTO) {\n this.id = data.id;\n this.chat_id = data.chat_id;\n this.cr_time = data.cr_time;\n this.type = data.type;\n this.transport_type = data.transport_type ?? null;\n this.transport_type_icon = data.transport_type_icon ?? null;\n this.user = data.user;\n this.content = data.content;\n this.avatar = data.avatar ?? null;\n this.checked = data.checked ?? null;\n this.file_path = data.file_path ?? null;\n this.file_list = data.file_list ?? null;\n }\n\n get dateSimple(): string {\n const d = new Date(this.cr_time.replace(' ', 'T'));\n const dd = String(d.getDate()).padStart(2, '0');\n const mm = String(d.getMonth() + 1).padStart(2, '0');\n const yyyy = d.getFullYear();\n return `${dd}.${mm}.${yyyy}`;\n }\n\n get timeHHmm(): string {\n const d = new Date(this.cr_time.replace(' ', 'T'));\n const hh = String(d.getHours()).padStart(2, '0');\n const mm = String(d.getMinutes()).padStart(2, '0');\n return `${hh}:${mm}`;\n }\n}\n\nexport interface ChatMessageDTO {\n id: number;\n chat_id: number;\n cr_time: string; // ISO or 'YYYY-MM-DD HH:mm:ss'\n type: ChatMessageType;\n transport_type?: string | null;\n transport_type_icon?: string | null;\n user: string;\n content: string;\n avatar?: string | null;\n file_path?: string[] | [] | null;\n file_list?: File[] | [] | null;\n checked?: boolean | null;\n}\n\nexport type ChatMessageType = 'incoming' | 'outgoing';\n\nexport enum MessageType {\n Incoming = 'incoming',\n Outgoing = 'outgoing'\n}\n\nexport interface CurrMessage {\n id?: number;\n content: string;\n file_path?: string[];\n file_list?: File[];\n user_id?: number;\n user?: string;\n transport_type?: string | null;\n transport_type_icon?: string | null;\n}\n\nexport type MessageActionType = 'send' | 'edit' | 'delete';\n\nexport interface MessageActionEvent {\n action: MessageActionType;\n chatMessageId?: number;\n content: string;\n file_path?: string[];\n file_list?: File[];\n user_id?: number;\n user?: string;\n transport_type?: string | null;\n transport_type_icon?: string | null;\n}\n","import {\n Component,\n ElementRef,\n ViewChild,\n computed,\n effect,\n input,\n model,\n inject,\n OnDestroy,\n AfterViewInit\n} from '@angular/core';\nimport {TranslocoPipe} from '@ngneat/transloco';\nimport {FocusTrap, FocusTrapFactory} from '@angular/cdk/a11y';\n\n@Component({\n selector: 'lib-preview-file',\n imports: [\n TranslocoPipe,\n ],\n templateUrl: './preview-file.html',\n styleUrl: './preview-file.scss',\n standalone: true,\n})\nexport class PreviewFile implements OnDestroy, AfterViewInit {\n public srcList = input<string[]>([]);\n public startIndex = input<number>(0);\n public title = input<string>('');\n public openerElement = input<HTMLElement | null>(null);\n public closeHandler = input<(() => unknown) | null>(null);\n public focusTrapFactory = inject(FocusTrapFactory);\n\n public activeIndex = model<number>(0);\n public viewReady = model<boolean>(false);\n public userNavigated = model<boolean>(false);\n public previousListLength = model<number>(0);\n public focusTrap: FocusTrap | null = null;\n\n @ViewChild('dialog') public dialogElement?: ElementRef<HTMLElement>;\n @ViewChild('closeButton') public closeButton?: ElementRef<HTMLButtonElement>;\n\n public currentSrc = computed(() => {\n const list = this.srcList();\n const index = this.activeIndex();\n\n return list[index] ?? '';\n });\n\n constructor() {\n effect(() => {\n const list = this.srcList();\n const initial = this.startIndex();\n const maxIndex = Math.max(0, list.length - 1);\n const currentIndex = this.activeIndex();\n const lengthChanged = this.previousListLength() !== list.length;\n\n if (!list.length) {\n this.activeIndex.set(0);\n this.userNavigated.set(false);\n this.previousListLength.set(0);\n return;\n }\n\n if (currentIndex > maxIndex) {\n this.activeIndex.set(maxIndex);\n this.previousListLength.set(list.length);\n return;\n }\n\n if (!this.userNavigated() || lengthChanged) {\n const nextIndex = Math.max(0, Math.min(initial, maxIndex));\n this.activeIndex.set(nextIndex);\n }\n\n this.previousListLength.set(list.length);\n\n });\n\n effect(() => {\n const isOpen = this.srcList().length > 0;\n const isReady = this.viewReady();\n\n if (!isReady) {\n return;\n }\n\n if (isOpen) {\n queueMicrotask(() => this.activateFocus());\n return;\n }\n\n this.destroyFocusTrap();\n });\n }\n\n ngAfterViewInit() {\n this.viewReady.set(true);\n }\n\n ngOnDestroy() {\n this.destroyFocusTrap();\n }\n\n requestClose() {\n const handler = this.closeHandler();\n if (handler) {\n handler();\n }\n\n this.restoreFocus();\n\n return this;\n }\n\n onKeyDown(event: KeyboardEvent) {\n if (event.key === 'Escape') {\n return this.requestClose();\n }\n if (event.key === 'ArrowRight') {\n return this.next();\n }\n if (event.key === 'ArrowLeft') {\n return this.prev();\n }\n return this;\n }\n\n prev() {\n const list = this.srcList();\n if (list.length < 2) {\n return this;\n }\n const nextIndex = (this.activeIndex() - 1 + list.length) % list.length;\n this.activeIndex.set(nextIndex);\n this.userNavigated.set(true);\n\n return this;\n }\n\n next() {\n const list = this.srcList();\n if (list.length < 2) {\n return this;\n }\n const nextIndex = (this.activeIndex() + 1) % list.length;\n this.activeIndex.set(nextIndex);\n this.userNavigated.set(true);\n\n return this;\n }\n\n select(index: number) {\n const list = this.srcList();\n if (!list.length) {\n return this;\n }\n\n const nextIndex = Math.max(0, Math.min(index, list.length - 1));\n this.activeIndex.set(nextIndex);\n this.userNavigated.set(true);\n\n return this;\n }\n\n activateFocus() {\n const dialog = this.dialogElement?.nativeElement;\n if (!dialog) {\n return this;\n }\n\n if (!this.focusTrap) {\n this.focusTrap = this.focusTrapFactory.create(dialog);\n }\n\n const closeButton = this.closeButton?.nativeElement;\n if (closeButton) {\n closeButton.focus();\n return this;\n }\n\n dialog.focus();\n return this;\n }\n\n destroyFocusTrap() {\n if (this.focusTrap) {\n this.focusTrap.destroy();\n this.focusTrap = null;\n }\n return this;\n }\n\n restoreFocus() {\n const opener = this.openerElement();\n if (opener) {\n queueMicrotask(() => opener.focus());\n }\n return this;\n }\n}\n","<div class=\"preview\" (click)=\"requestClose()\">\n <div class=\"preview__dialog\"\n #dialog\n tabindex=\"-1\"\n role=\"dialog\"\n aria-modal=\"true\"\n [attr.aria-label]=\"title() || ('chat.photo_preview' | transloco)\"\n (keydown)=\"onKeyDown($event)\"\n (click)=\"$event.stopPropagation()\">\n <div class=\"preview__header\">\n <h3 class=\"preview__title\">\n {{ title() || ('chat.photo_preview' | transloco) }}\n </h3>\n <button type=\"button\"\n class=\"preview__close\"\n [attr.aria-label]=\"'chat.close' | transloco\"\n #closeButton\n (click)=\"requestClose()\">\n <span class=\"preview__close-icon\" aria-hidden=\"true\"></span>\n </button>\n </div>\n <div class=\"preview__body\">\n @if (srcList().length > 1) {\n <button type=\"button\"\n class=\"preview__nav preview__nav--prev\"\n [attr.aria-label]=\"'chat.previous' | transloco\"\n (click)=\"prev()\">\n </button>\n <button type=\"button\"\n class=\"preview__nav preview__nav--next\"\n [attr.aria-label]=\"'chat.next' | transloco\"\n (click)=\"next()\">\n </button>\n }\n <img [src]=\"currentSrc()\"\n [attr.alt]=\"'chat.photo_preview_image_x_of_y' | transloco : { index: activeIndex() + 1, total: srcList().length }\"\n class=\"preview__image\"\n (click)=\"next()\"\n (keydown.enter)=\"$event.preventDefault(); next()\"\n (keydown.space)=\"$event.preventDefault(); next()\"/>\n </div>\n @if (srcList().length > 1) {\n <div class=\"preview__thumbs\">\n @for (file of srcList(); track file; let i = $index) {\n <button type=\"button\"\n class=\"preview__thumb\"\n [class.preview__thumb--active]=\"i === activeIndex()\"\n (click)=\"select(i)\">\n <img [src]=\"file\"\n [attr.alt]=\"'chat.thumbnail_alt' | transloco : { index: i + 1, total: srcList().length }\"/>\n </button>\n }\n </div>\n }\n </div>\n</div>\n","import {Injectable} from '@angular/core';\nimport {HttpClient} from '@angular/common/http';\n\n\n@Injectable({\n providedIn: 'root'\n})\nexport class UtilsService {\n\n constructor(protected http: HttpClient) {\n }\n\n langToLocale(lang: string): string {\n switch (lang) {\n case 'uk':\n return 'uk-UA';\n case 'en':\n default:\n return 'en-US';\n }\n }\n\n getLocalISODate(): string {\n const d = new Date();\n\n const year = d.getFullYear();\n const month = String(d.getMonth() + 1).padStart(2, '0');\n const day = String(d.getDate()).padStart(2, '0');\n\n const hours = String(d.getHours()).padStart(2, '0');\n const minutes = String(d.getMinutes()).padStart(2, '0');\n const seconds = String(d.getSeconds()).padStart(2, '0');\n\n return `${year}-${month}-${day}T${hours}:${minutes}:${seconds}`;\n }\n\n normalizeSourcePath(sourcePath: string): string {\n const cleanedPath = (sourcePath ?? '').trim();\n if (!cleanedPath) {\n return '';\n }\n\n if (cleanedPath.startsWith('data:') || cleanedPath.startsWith('blob:') || /^https?:\\/\\//i.test(cleanedPath)) {\n return cleanedPath;\n }\n\n const assetsIndex = cleanedPath.indexOf('assets/');\n if (assetsIndex >= 0) {\n return '/' + cleanedPath.slice(assetsIndex);\n }\n\n return cleanedPath.replace(/^\\.{1,2}\\//, '/');\n }\n}\n","import {Component, computed, input, model} from '@angular/core';\nimport {DatePipe, NgClass, NgOptimizedImage} from '@angular/common';\nimport {ChatMessage, MessageType} from '../../entity/chat';\nimport {MatMenu, MatMenuItem, MatMenuTrigger} from '@angular/material/menu';\nimport {TranslocoPipe} from '@ngneat/transloco';\nimport {PreviewFile} from '../preview-file/preview-file';\nimport {UtilsService} from '../../service/utils/utils';\n\n@Component({\n selector: 'lib-chat-message',\n imports: [\n NgClass,\n NgOptimizedImage,\n DatePipe,\n MatMenu,\n MatMenuItem,\n MatMenuTrigger,\n TranslocoPipe,\n PreviewFile,\n ],\n templateUrl: './chat-message.html',\n styleUrl: './chat-message.scss',\n standalone: true,\n})\n\nexport class ChatMessageComponent {\n public currentMessage = input.required<ChatMessage>();\n public edit = model<boolean>(false);\n public previewList = model<string[]>([]);\n public previewIndex = model<number>(0);\n public previewOpener = model<HTMLElement | null>(null);\n public closePreviewHandler = () => this.closePreview();\n\n public requestEdit = model<ChatMessage | null>(null);\n public requestDelete = model<number | null>(null);\n\n constructor(private utils: UtilsService) {}\n\n attachments = computed(() => {\n const message = this.currentMessage();\n const filePath = message.file_path;\n\n if (Array.isArray(filePath)) {\n return filePath.map(p => this.utils.normalizeSourcePath(p)).filter(Boolean);\n }\n\n const rawFilePath = (filePath as unknown as string) ?? '';\n if (typeof rawFilePath !== 'string' || !rawFilePath.trim) {\n return [];\n }\n\n if (rawFilePath.trim().startsWith('[')) {\n try {\n const parsed = JSON.parse(rawFilePath);\n if (Array.isArray(parsed)) {\n return parsed\n .map(item => (typeof item === 'string' ? this.utils.normalizeSourcePath(item) : ''))\n .filter(Boolean);\n }\n } catch {}\n }\n\n if (rawFilePath.startsWith('data:')) {\n return [rawFilePath];\n }\n\n if (rawFilePath.includes('|')) {\n return rawFilePath.split('|').map(p => this.utils.normalizeSourcePath(p)).filter(Boolean);\n }\n if (rawFilePath.includes(',')) {\n return rawFilePath.split(',').map(p => this.utils.normalizeSourcePath(p)).filter(Boolean);\n }\n\n return [];\n });\n\n avatarSrc = computed(() => {\n const message = this.currentMessage();\n const fallback = message.type === 'incoming'\n ? 'assets/ngx-parl/icons/avatar_anonym.svg'\n : 'assets/ngx-parl/icons/avatar_manager.svg';\n\n return message.avatar || fallback;\n });\n\n openContextMenu(event: Event, trigger: MatMenuTrigger, triggerElement: HTMLElement) {\n event.preventDefault();\n event.stopPropagation();\n\n if (event instanceof MouseEvent) {\n triggerElement.style.setProperty('inset-inline-start', `${event.clientX}px`);\n triggerElement.style.setProperty('inset-block-start', `${event.clientY}px`);\n triggerElement.style.removeProperty('left');\n triggerElement.style.removeProperty('top');\n }\n\n trigger.openMenu();\n\n return this;\n }\n\n editMessage(message: ChatMessage) {\n this.edit.set(true);\n this.requestEdit.set(message);\n\n return this;\n }\n\n openPreview(index: number, event: MouseEvent) {\n const list = this.attachments();\n if (!list.length) {\n return this;\n }\n\n const opener = event.currentTarget instanceof HTMLElement ? event.currentTarget : null;\n this.previewOpener.set(opener);\n this.previewList.set(list);\n this.previewIndex.set(Math.max(0, Math.min(index, list.length - 1)));\n\n return this;\n }\n\n closePreview() {\n this.previewList.set([]);\n this.previewIndex.set(0);\n this.previewOpener.set(null);\n\n return this;\n }\n\n deleteMessage(message: ChatMessage) {\n this.requestDelete.set(message.id);\n queueMicrotask(() => this.requestDelete.set(null));\n\n return this;\n }\n\n canDelete(message: ChatMessage): boolean {\n return message.type === this.messageType.Outgoing;\n }\n\n public readonly messageType = MessageType;\n}\n","<div class=\"message\"\n [ngClass]=\"{\n 'message--outgoing': currentMessage().type === messageType.Outgoing,\n 'message--incoming': currentMessage().type === messageType.Incoming\n }\">\n <div class=\"message__avatar\">\n <img [ngSrc]=\"avatarSrc()\" width=\"36\" height=\"36\" alt=\"avatar\"/>\n </div>\n\n <div class=\"message__body\"\n [class.message__body--attachments-1]=\"attachments().length === 1\"\n [class.message__body--attachments-2]=\"attachments().length === 2\"\n [class.message__body--attachments-3]=\"attachments().length >= 3\"\n (contextmenu)=\"openContextMenu($event, menuTrigger, menuTriggerEl)\"\n (keydown.shift.F10)=\"$event.preventDefault(); menuTrigger.openMenu()\">\n <button type=\"button\"\n class=\"message__menu-trigger\"\n aria-hidden=\"true\"\n tabindex=\"-1\"\n #menuTrigger=\"matMenuTrigger\"\n #menuTriggerEl\n [matMenuTriggerFor]=\"messageMenu\"\n >\n </button>\n\n @if (attachments().length) {\n <div class=\"message__attachments\">\n @for (file of attachments(); track file; let i = $index) {\n <button type=\"button\"\n class=\"message__image-button\"\n (click)=\"openPreview(i, $event)\"\n [attr.aria-label]=\"'chat.photo_preview' | transloco\">\n <img [src]=\"file\"\n alt=\"attachment\"\n class=\"message__image\"\n loading=\"lazy\"/>\n </button>\n }\n </div>\n }\n\n <div class=\"message__bubble\" tabindex=\"0\">\n <div class=\"message__text\">{{ currentMessage().content }}</div>\n\n <div class=\"message__meta\">\n <time class=\"message__time\">\n {{ currentMessage().cr_time | date:'HH:mm' }}\n </time>\n @if (currentMessage().type === messageType.Outgoing) {\n @if (currentMessage().checked) {\n <img ngSrc=\"assets/ngx-parl/icons/checked-message.svg\"\n class=\"message__icon\"\n width=\"18\" height=\"18\" alt=\"hide\"/>\n } @else {\n <img ngSrc=\"assets/ngx-parl/icons/no-check.svg\"\n class=\"message__icon\"\n width=\"18\" height=\"18\" alt=\"hide\"/>\n }\n }\n </div>\n </div>\n </div>\n</div>\n<div class=\"message__user\">\n @if (currentMessage().type === messageType.Outgoing) {\n <span class=\"message__user-name\">{{ currentMessage().user }}</span>\n }\n</div>\n\n@if (previewList().length) {\n <lib-preview-file\n [srcList]=\"previewList()\"\n [startIndex]=\"previewIndex()\"\n [openerElement]=\"previewOpener()\"\n [closeHandler]=\"closePreviewHandler\">\n </lib-preview-file>\n}\n\n<mat-menu #messageMenu=\"matMenu\" yPosition=\"below\" xPosition=\"before\" class=\"message__menu\">\n @if (currentMessage().type === messageType.Outgoing) {\n <button mat-menu-item (click)=\"editMessage(currentMessage())\">\n <img ngSrc=\"assets/ngx-parl/icons/icon-edit.svg\"\n class=\"message__icon--menu\"\n width=\"20\" height=\"20\" alt=\"hide\"/>\n <span>{{ 'chat.edit' | transloco }}</span>\n </button>\n }\n @if (canDelete(currentMessage())) {\n <button mat-menu-item (click)=\"deleteMessage(currentMessage())\">\n <img ngSrc=\"assets/ngx-parl/icons/trash.svg\"\n class=\"message__icon--menu\"\n width=\"20\" height=\"20\" alt=\"hide\"/>\n <span>{{ 'chat.remove' | transloco }}</span>\n </button>\n }\n</mat-menu>\n","import {Pipe, PipeTransform} from '@angular/core';\nimport {DatePipe} from '@angular/common';\nimport {ChatMessage} from '../entity/chat';\nimport {UtilsService} from '../service/utils/utils';\nimport {TranslocoService} from '@ngneat/transloco';\n\n@Pipe({\n name: 'toggleDisplayChatStartDay'\n})\nexport class ToggleDisplayChatStartDayPipe implements PipeTransform {\n\n constructor(protected utils: UtilsService, private transloco: TranslocoService) {}\n\n transform(message: ChatMessage, messages: ChatMessage[], i: number): boolean {\n const locale = this.utils.langToLocale(this.transloco.getActiveLang());\n const datePipe = new DatePipe(locale);\n\n const prev = i > 0 ? messages[i - 1] : undefined;\n\n const currDay = datePipe.transform(new Date(message.cr_time), 'shortDate');\n const prevDay = prev ? datePipe.transform(new Date(prev.cr_time), 'shortDate') : undefined;\n\n return prev ? currDay !== prevDay : true;\n }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\nimport {DatePipe} from '@angular/common';\nimport {UtilsService} from '../service/utils/utils';\nimport {TranslocoService} from '@ngneat/transloco';\n\n@Pipe({\n name: 'chatStartDay'\n})\nexport class ChatStartDayPipe implements PipeTransform {\n constructor(protected utils: UtilsService, private transloco: TranslocoService) {}\n\n transform(value: string, format: string = 'd MMMM'): string {\n if (!value) {\n return '';\n }\n\n const locale = this.utils.langToLocale(this.transloco.getActiveLang());\n const datePipe = new DatePipe(locale);\n\n const valueDate = new Date(value);\n const today = new Date();\n\n const isToday = datePipe.transform(valueDate, 'shortDate') === datePipe.transform(today, 'shortDate');\n\n return isToday\n ? (locale.startsWith('uk') ? 'Сьогодні' : 'Today')\n : (datePipe.transform(valueDate, format) ?? '');\n }\n\n}\n","import {AfterViewInit, Component, computed, effect, ElementRef, model, signal, ViewChild,} from '@angular/core';\nimport {FormsModule} from '@angular/forms';\nimport {ChatMessage} from '../core/entity/chat';\nimport {ChatMessageComponent} from '../core/components/chat-message/chat-message';\nimport {TranslocoPipe} from '@ngneat/transloco';\nimport {NgOptimizedImage} from '@angular/common';\nimport {InfiniteScrollDirective} from 'ngx-infinite-scroll';\nimport {ToggleDisplayChatStartDayPipe} from '../core/pipes/toggle-display-chat-start-day-pipe';\nimport {ChatStartDayPipe} from '../core/pipes/chat-start-day-pipe';\n\n@Component({\n selector: 'app-chat-flow',\n imports: [\n FormsModule,\n ChatMessageComponent,\n TranslocoPipe,\n NgOptimizedImage,\n InfiniteScrollDirective,\n ToggleDisplayChatStartDayPipe,\n ChatStartDayPipe\n ],\n templateUrl: './chat-flow.html',\n styleUrl: './chat-flow.scss',\n standalone: true,\n})\n\nexport class ChatFlowComponent implements AfterViewInit {\n @ViewChild('chatFlowRef') flowRef?: ElementRef<HTMLElement>;\n\n public scrollToBottomTrigger = model<number>(0);\n public loadHistory = model<boolean>(false);\n\n public messageListInput = model.required<ChatMessage[]>();\n public messageList = computed(() => this.messageListInput());\n\n public selectedForEdit = model.required<ChatMessage | null>();\n public requestDelete = model<number | null>(null);\n\n private viewInitialized = false;\n private previousMessageCount = 0;\n private previousFirstMessageId: number | null = null;\n private previousLastMessageId: number | null = null;\n private pendingHistoryRestore = false;\n\n private previousScrollHeight = 0;\n private previousScrollTop = 0;\n private isUserAtBottom = true;\n\n public showScrollToBottom = signal(false);\n\n public historyLoadThreshold = signal(1);\n\n constructor() {\n effect(() => {\n const messages = this.messageList();\n const firstMessageId = messages[0]?.id ?? null;\n const lastMessageId = messages.at(-1)?.id ?? null;\n\n if (!this.viewInitialized) {\n this.previousMessageCount = messages.length;\n this.previousFirstMessageId = firstMessageId;\n this.previousLastMessageId = lastMessageId;\n return;\n }\n\n const hasMoreMessages = messages.length > this.previousMessageCount;\n const hasPrependedMessages =\n hasMoreMessages &&\n this.previousFirstMessageId !== null &&\n firstMessageId !== this.previousFirstMessageId;\n const hasAppendedMessages =\n hasMoreMessages &&\n this.previousLastMessageId !== null &&\n lastMessageId !== this.previousLastMessageId;\n\n const shouldRestoreHistory =\n !this.isUserAtBottom &&\n hasMoreMessages &&\n (hasPrependedMessages || (this.pendingHistoryRestore && !hasAppendedMessages));\n\n if (shouldRestoreHistory) {\n this.restoreScrollAfterHistoryPrepend();\n this.pendingHistoryRestore = false;\n }\n\n if (hasMoreMessages && this.isUserAtBottom) {\n queueMicrotask(() => this.scrollToBottom());\n }\n\n if (hasMoreMessages && hasAppendedMessages && !hasPrependedMessages) {\n this.pendingHistoryRestore = false;\n }\n\n this.previousMessageCount = messages.length;\n this.previousFirstMessageId = firstMessageId;\n this.previousLastMessageId = lastMessageId;\n });\n\n effect(() => {\n this.scrollToBottomTrigger();\n\n if (this.viewInitialized) {\n queueMicrotask(() => this.scrollToBottomSmooth());\n }\n });\n }\n\n ngAfterViewInit(): void {\n this.viewInitialized = true;\n\n const element = this.flowRef?.nativeElement;\n if (!element) {\n return;\n }\n\n element.addEventListener('scroll', () => {\n this.previousScrollHeight = element.scrollHeight;\n this.previousScrollTop = element.scrollTop;\n\n this.isUserAtBottom =\n element.scrollTop + element.clientHeight >=\n element.scrollHeight - 10;\n this.showScrollToBottom.set(!this.isUserAtBottom);\n });\n\n queueMicrotask(() => this.scrollToBottom());\n }\n\n onScrollUp(): this {\n this.pendingHistoryRestore = true;\n this.loadHistory.set(true);\n\n setTimeout(() => this.loadHistory.set(false), 0);\n\n return this;\n }\n\n restoreScrollAfterHistoryPrepend(): this {\n const element = this.flowRef?.nativeElement;\n if (!element) {\n return this;\n }\n\n const savedScrollTop = this.previousScrollTop;\n const savedScrollHeight = this.previousScrollHeight;\n\n queueMicrotask(() => {\n const newScrollHeight = element.scrollHeight;\n const heightDiff = newScrollHeight - savedScrollHeight;\n const previousBehavior = element.style.scrollBehavior;\n element.style.scrollBehavior = 'auto';\n element.scrollTop = savedScrollTop + heightDiff;\n element.style.scrollBehavior = previousBehavior;\n });\n\n return this;\n }\n\n scrollToBottomSmooth(): this {\n const element = this.flowRef?.nativeElement;\n if (!element) {\n return this;\n }\n\n element.scrollTo({\n top: element.scrollHeight,\n behavior: 'smooth',\n });\n this.isUserAtBottom = true;\n this.showScrollToBottom.set(false);\n\n return this;\n }\n\n scrollToBottom(): this {\n const element = this.flowRef?.nativeElement;\n if (!element) {\n return this;\n }\n\n element.scrollTop = element.scrollHeight;\n this.isUserAtBottom = true;\n this.showScrollToBottom.set(false);\n return this;\n }\n\n startEdit(message: ChatMessage): this {\n this.messageList().forEach(current => {\n if (current.id !== message.id && current.edit) {\n current.edit = false;\n }\n });\n\n message.edit = true;\n\n if (this.selectedForEdit()?.id === message.id) {\n this.selectedForEdit.set(null);\n queueMicrotask(() => this.selectedForEdit.set(message));\n } else {\n this.selectedForEdit.set(message);\n }\n\n return this;\n }\n\n onEditChange(id: number, isEdit: boolean): this {\n const message = this.messageList().find(item => item.id === id);\n if (!message) {\n return this;\n }\n\n if (isEdit) {\n return this.startEdit(message);\n }\n\n message.edit = false;\n\n if (this.selectedForEdit()?.id === id) {\n this.selectedForEdit.set(null);\n }\n\n return this;\n }\n\n onRequestEdit(message: ChatMessage | null): this {\n if (message) {\n return this.startEdit(message);\n }\n\n this.selectedForEdit.set(null);\n return this;\n }\n\n onRequestDelete(messageId: number | null): this {\n if (messageId == null) {\n return this;\n }\n\n this.selectedForEdit.set(null);\n this.requestDelete.set(messageId);\n queueMicrotask(() => this.requestDelete.set(null));\n\n return this;\n }\n\n trackByMessageId(index: number, message: ChatMessage): string {\n return `${message.chat_id}-${message.type}-${message.id}-${index}`;\n }\n\n protected readonly Math = Math;\n}\n","<div class=\"chat\">\n @if (messageList()) {\n <div #chatFlowRef\n class=\"chat__flow\"\n infiniteScroll\n [scrollWindow]=\"false\"\n [infiniteScrollUpDistance]=\"Math.max(historyLoadThreshold(), 2)\"\n [infiniteScrollThrottle]=\"100\"\n (scrolledUp)=\"onScrollUp()\"\n >\n @for (message of messageList(); track trackByMessageId(i, message); let i = $index) {\n @if (message | toggleDisplayChatStartDay: messageList() : i) {\n <span class=\"chat__start-day\">\n {{ message.cr_time | chatStartDay:'d MMMM' }}\n </span>\n }\n\n <div class=\"chat__message\" [attr.data-message-id]=\"message.id\">\n <lib-chat-message\n [currentMessage]=\"message\"\n [edit]=\"message.edit\"\n (editChange)=\"onEditChange(message.id, $event)\"\n (requestEditChange)=\"onRequestEdit($event)\"\n (requestDeleteChange)=\"onRequestDelete($event)\">\n </lib-chat-message>\n </div>\n }\n </div>\n\n @if (showScrollToBottom()) {\n <button class=\"chat__scroll-button\"\n type=\"button\"\n (click)=\"scrollToBottomSmooth()\"\n aria-label=\"Scroll to bottom\">\n <img ngSrc=\"assets/ngx-parl/icons/bottom-scroll.svg\"\n alt=\"\"\n width=\"14\"\n height=\"14\"/>\n </button>\n }\n } @else {\n <div class=\"chat__flow__empty\">\n <img ngSrc=\"assets/ngx-parl/icons/lucide_send.svg\"\n class=\"message__icon\"\n width=\"18\" height=\"24\" alt=\"hide\"/>\n\n\n <div class=\"chat__flow__empty--header\">\n <h3 class=\"chat__flow__empty--title\">{{ 'chat.chat_empty_title' | transloco }}</h3>\n <p class=\"chat__flow__empty--subscription\">{{ 'chat.chat_empty_subscription' | transloco }}</p>\n </div>\n </div>\n }\n</div>\n\n","export class ImageFile {\n constructor(\n public id: string,\n public url: string,\n public cr_time: string,\n ) {}\n}\n\nexport type OriginalKind = 'image' | 'gif';\n\nexport interface PreviewItem {\n originalKind: OriginalKind;\n duration?: number;\n src: string;\n name: string;\n type: string;\n size: number;\n}\n\nexport enum FileType {\n IMAGE = 'image',\n GIF = 'gif'\n}\n","import {\n AfterViewInit,\n Component,\n computed,\n effect,\n ElementRef,\n input,\n model,\n OnDestroy,\n signal,\n ViewChild\n} from '@angular/core';\nimport {FileType, OriginalKind, PreviewItem} from '../core/entity/file';\nimport {TranslocoPipe} from '@ngneat/transloco';\nimport {ChatMessage, CurrMessage, MessageActionEvent, MessageActionType} from '../core/entity/chat';\nimport {NgOptimizedImage} from '@angular/common';\n\n@Component({\n selector: 'app-input-message',\n imports: [TranslocoPipe, NgOptimizedImage],\n templateUrl: './input-message.html',\n styleUrl: './input-message.scss',\n standalone: true,\n})\n\nexport class InputMessageComponent implements AfterViewInit, OnDestroy {\n @ViewChild('inputText', {static: false}) inputTextElement!: ElementRef<HTMLDivElement>;\n @ViewChild('mirror', {static: false}) mirrorElement!: ElementRef<HTMLDivElement>;\n\n public editMessage = input<ChatMessage | { id: number; content: string; file_path?: string[] | null } | null>(null);\n\n public hasOriginalAttachments = computed(() => {\n const filePaths = this.editFilePaths();\n return filePaths.length > 0;\n });\n\n public hasNewAttachments = computed(() => (this.previews()?.length ?? 0) > 0);\n\n public cancelEdit = model<number | null>(null);\n public input_text = model<string | CurrMessage>('');\n\n public draft = signal<string>('');\n public focused = signal<boolean>(false);\n public sending = signal<boolean>(false);\n public hasText = computed(() => this.draft().trim().length > 0);\n public dragActive = signal<boolean>(false);\n\n public isEditMode = computed(() => !!this.editMessage());\n public canSend = computed(() =>\n this.hasText() ||\n this.hasNewAttachments() ||\n (this.isEditMode() && this.hasOriginalAttachments())\n );\n\n public files = model<File[]>([]);\n public previews = model<PreviewItem[]>([]);\n\n private lastHeightPx = 0;\n private lastRows = 1;\n private resizeRaf: number | null = null;\n private dragDepth = 0;\n\n public messageEvent = model<MessageActionEvent | null>(null);\n\n constructor() {\n effect(() => {\n const message = this.editMessage();\n const element = this.inputTextElement?.nativeElement;\n\n if (!element) {\n return;\n }\n\n if (message) {\n const content = (message as any).content ?? '';\n this.draft.set(content);\n element.innerText = content;\n\n queueMicrotask(() => {\n this.autoResizeByRows();\n element.focus();\n this.focused.set(true);\n });\n }\n });\n }\n\n ngAfterViewInit() {\n const element = this.inputTextElement.nativeElement;\n element.style.transition = 'height 160ms ease';\n this.initMirror();\n\n const computedStyle = getComputedStyle(element);\n const lineHeight = this.cssNum(computedStyle.lineHeight, 24);\n\n element.style.height = `${lineHeight}px`;\n this.lastHeightPx = lineHeight;\n this.lastRows = 1;\n this.updateOverflow(1);\n\n requestAnimationFrame(() => {\n const {rows, nextHeightPx} = this.measureByMirror();\n element.style.height = `${nextHeightPx}px`;\n\n this.lastRows = rows;\n this.lastHeightPx = nextHeightPx;\n this.updateOverflow(rows);\n\n this.focusInput();\n });\n }\n\n ngOnDestroy() {\n if (this.resizeRaf) {\n cancelAnimationFrame(this.resizeRaf);\n this.resizeRaf = null;\n }\n }\n\n editFilePaths(): string[] {\n const message = this.editMessage();\n if (!message) {\n return [];\n }\n\n const file_path = (message as any).file_path;\n\n return Array.isArray(file_path) ? file_path : [];\n }\n\n collectAttachmentSources(): string[] {\n const newAttachments = (this.previews() ?? []).map(p => p.src).filter(Boolean);\n if (!this.isEditMode()) {\n return newAttachments;\n }\n\n const originalAttachments = this.editFilePaths().filter(Boolean);\n return Array.from(new Set([...originalAttachments, ...newAttachments]));\n }\n\n cancelEditMessage() {\n const message = this.editMessage();\n this.cancelEdit.set((message as any)?.id ?? null);\n queueMicrotask(() => this.cancelEdit.set(null));\n\n this.draft.set('');\n const element = this.inputTextElement?.nativeElement;\n\n if (element) {\n element.innerHTML = '';\n this.autoResizeByRows();\n element.focus();\n }\n\n return this;\n }\n\n focusInput() {\n const element = this.inputTextElement?.nativeElement;\n if (!element) {\n return this;\n }\n queueMicrotask(() => {\n element.focus();\n this.focused.set(true);\n });\n\n return this;\n }\n\n enterDown() {\n const element = this.inputTextElement.nativeElement;\n const text = this.draft().trim();\n\n if (!this.canSend()) {\n return this;\n }\n\n this.sending.set(true);\n\n const files = this.collectAttachmentSources();\n const fileList = this.files();\n\n const message = this.editMessage();\n const action: MessageActionType = message ? 'edit' : 'send';\n\n this.messageEvent.set({\n action,\n chatMessageId: message ? message.id : undefined,\n content: text,\n file_path: files.length ? files : [],\n file_list: fileList.length ? fileList : [],\n });\n\n queueMicrotask(() => this.messageEvent.set(null));\n\n const payload: CurrMessage = message ? {\n id: message.id,\n content: text,\n file_path: files.length ? files : [],\n file_list: fileList.length ? fileList : [],\n } : {\n content: text,\n file_path: files.length ? files : [],\n file_list: fileList.length ? fileList : [],\n };\n\n this.input_text.set(payload);\n\n this.draft.set('');\n element.innerHTML = '';\n this.files.set([]);\n this.previews.set([]);\n element.focus();\n this.autoResizeByRows();\n\n setTimeout(() => this.sending.set(false), 150);\n\n return this;\n }\n\n onFocus() {\n if (this.inputTextElement.nativeElement.innerHTML === '<br>') {\n this.inputTextElement.nativeElement.innerHTML = '';\n }\n this.focused.set(true);\n\n return this;\n }\n\n onBlur() {\n this.focused.set(false);\n\n return this;\n }\n\n onKeyDown(event: KeyboardEvent) {\n if (event.key === 'Enter' && !event.shiftKey) {\n event.preventDefault();\n this.enterDown();\n\n return this;\n }\n queueMicrotask(() => this.autoResizeByRows());\n\n return this;\n }\n\n onInput() {\n this.draft.set(this.inputTextElement.nativeElement.innerText ?? '');\n this.autoResizeByRows();\n\n return this;\n }\n\n onPaste() {\n queueMicrotask(() => {\n this.draft.set(this.inputTextElement.nativeElement.innerText ?? '');\n this.autoResizeByRows();\n });\n\n return this;\n }\n\n inputFileChange(event: Event) {\n const inputEl = event.target as HTMLInputElement;\n const selected = inputEl.files;\n\n if (!selected?.length) {\n inputEl.value = '';\n\n return this;\n }\n this.addFiles(Array.from(selected));\n inputEl.value = '';\n\n return this;\n }\n\n onDragEnter(event: DragEvent) {\n event.preventDefault();\n event.stopPropagation();\n this.dragDepth += 1;\n this.dragActive.set(true);\n\n return this;\n }\n\n onDragOver(event: DragEvent) {\n event.preventDefault();\n event.stopPropagation();\n if (event.dataTransfer) {\n event.dataTransfer.dropEffect = 'copy';\n }\n this.dragActive.set(true);\n\n return this;\n }\n\n onDragLeave(event: DragEvent) {\n event.preventDefault();\n event.stopPropagation();\n this.dragDepth = Math.max(0, this.dragDepth - 1);\n if (this.dragDepth === 0) {\n this.dragActive.set(false);\n }\n\n return this;\n }\n\n onDrop(event: DragEvent) {\n event.preventDefault();\n event.stopPropagation();\n this.dragDepth = 0;\n this.dragActive.set(false);\n\n const files = event.dataTransfer?.files;\n if (!files?.length) {\n return this;\n }\n\n this.addFiles(Array.from(files));\n\n return this;\n }\n\n removeFile(index: number, event?: MouseEvent) {\n event?.stopPropagation();\n event?.preventDefault();\n\n const previews = [...(this.previews() ?? [])];\n previews.splice(index, 1);\n this.previews.set(previews);\n\n const filesArr = [...(this.files() ?? [])];\n if (index >= 0 && index < filesArr.length) {\n filesArr.splice(index, 1);\n this.files.set(filesArr);\n }\n return this;\n }\n\n openPreview(_item: PreviewItem, _index: number) {\n return this;\n }\n\n autoResizeByRows() {\n const element = this.inputTextElement.nativeElement;\n const {rows, nextHeightPx} = this.measureByMirror();\n\n if (rows === this.lastRows) {\n this.updateOverflow(rows);\n\n return this;\n }\n\n if (this.resizeRaf) {\n cancelAnimationFrame(this.resizeRaf);\n }\n\n element.style.height = `${this.lastHeightPx}px`;\n\n this.resizeRaf = requestAnimationFrame(() => {\n element.style.height = `${nextHeightPx}px`;\n this.lastHeightPx = nextHeightPx;\n this.lastRows = rows;\n this.updateOverflow(rows);\n });\n\n return this;\n }\n\n measureByMirror(): { rows: number; nextHeightPx: number } {\n const inputEl = this.inputTextElement.nativeElement;\n const mirrorEl = this.mirrorElement.nativeElement;\n const computedStyle = getComputedStyle(inputEl);\n\n let text = inputEl.innerText;\n if (!text || text === '\\n') {\n text = '\\u00A0';\n }\n\n mirrorEl.style.width = computedStyle.width;\n mirrorEl.textContent = text;\n\n const lineHeight = this.cssNum(computedStyle.lineHeight, 24);\n const paddingTop = this.cssNum(computedStyle.paddingTop, 0);\n const paddingBottom = this.cssNum(computedStyle.paddingBottom, 0);\n const paddingY = paddingTop + paddingBottom;\n\n const maxRowsCss = computedStyle.getPropertyValue('--max-rows').trim();\n const maxRows = maxRowsCss ? this.cssNum(maxRowsCss, 8) : 8;\n\n const contentH = mirrorEl.offsetHeight;\n const rawRows = Math.max(1, Math.ceil(contentH / lineHeight));\n const rows = Math.min(rawRows, maxRows);\n\n const nextHeightPx = Math.round(rows * lineHeight + paddingY);\n\n return {rows, nextHeightPx};\n }\n\n initMirror() {\n const mirror = this.mirrorElement.nativeElement;\n const input = this.inputTextElement.nativeElement;\n const computedStyle = getComputedStyle(input);\n\n mirror.style.position = 'absolute';\n mirror.style.visibility = 'hidden';\n mirror.style.pointerEvents = 'none';\n mirror.style.zIndex = '-1';\n mirror.style.whiteSpace = 'pre-wrap';\n mirror.style.overflowWrap = 'break-word';\n mirror.style.wordBreak = 'normal';\n\n const properties = [\n 'font', 'font-size', 'font-family', 'font-weight', 'font-style',\n 'line-height', 'letter-spacing', 'word-spacing',\n 'padding-top', 'padding-bottom', 'padding-left', 'padding-right',\n 'border-top-width', 'border-bottom-width', 'border-left-width', 'border-right-width',\n 'white-space', 'text-transform', 'box-sizing'\n ];\n\n properties.forEach(property => (mirror.style as any)[property] = computedStyle.getPropertyValue(property));\n mirror.style.paddingTop = '0px';\n mirror.style.paddingBottom = '0px';\n }\n\n updateOverflow(rows: number) {\n const element = this.inputTextElement.nativeElement;\n const computedStyle = getComputedStyle(element);\n const maxRowsCss = computedStyle.getPropertyValue('--max-rows').trim();\n const maxRows = maxRowsCss ? this.cssNum(maxRowsCss, 8) : 8;\n element.style.overflowY = rows >= maxRows ? 'auto' : 'hidden';\n\n return this;\n }\n\n readFileAsDataURL(file: File): Promise<string> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = e => resolve((e.target?.result as string) || '');\n reader.onerror = reject;\n reader.readAsDataURL(file);\n });\n }\n\n cssNum(v: string, fb = 0): number {\n const n = parseFloat(v);\n return Number.isFinite(n) ? n : fb;\n }\n\n public addFiles(files: File[]) {\n const list = files.filter(f => (f.type || '').startsWith('image/'));\n if (!list.length) {\n return this;\n }\n\n this.files.set([...(this.files() ?? []), ...list]);\n\n Promise.all(\n list.map(async f => {\n const src = await this.readFileAsDataURL(f);\n const originalKind: OriginalKind = (f.type || '') === 'image/gif' ? FileType.GIF : FileType.IMAGE;\n return <PreviewItem>{src, originalKind, name: f.name, type: f.type || '', size: f.size};\n })\n )\n .then(items => this.previews.set([...(this.previews() ?? []), ...items]));\n\n return this;\n }\n\n protected readonly FileType = FileType;\n}\n","<section class=\"message\"\n [class.message--focus]=\"focused()\"\n [class.message--filled]=\"hasText()\"\n [class.message--sending]=\"sending()\"\n [class.message--dragover]=\"dragActive()\"\n (dragenter)=\"onDragEnter($event)\"\n (dragover)=\"onDragOver($event)\"\n (dragleave)=\"onDragLeave($event)\"\n (drop)=\"onDrop($event)\">\n\n @if (isEditMode()) {\n <div class=\"message__wrap\">\n <div class=\"message__wrap--input\">\n <button class=\"message__button message__button--attach\">\n <img ngSrc=\"assets/ngx-parl/icons/icon-edit.svg\"\n class=\"message__icon message__icon--edit\"\n width=\"18\" height=\"18\" alt=\"hide\"/>\n </button>\n\n <div class=\"message__edit-hint\">\n <p>{{ editMessage()?.content }}</p>\n </div>\n </div>\n\n <button class=\"message__button message__button--close\"\n type=\"button\"\n (click)=\"cancelEditMessage()\">\n <img ngSrc=\"assets/ngx-parl/icons/close.svg\"\n class=\"message__icon message__icon--close\"\n width=\"18\" height=\"18\" alt=\"hide\"/>\n </button>\n </div>\n }\n\n <div class=\"message__wrap\">\n <div class=\"message__wrap--input\">\n <button type=\"button\"\n class=\"message__button message__button--attach\"\n [attr.aria-label]=\"'chat.attach' | transloco\"\n (click)=\"fileDialog.click()\">\n <img ngSrc=\"assets/ngx-parl/icons/attach-filled.svg\"\n class=\"message__icon message__icon--attach\"\n width=\"18\" height=\"18\" alt=\"hide\"/>\n </button>\n\n <input #fileDialog\n type=\"file\"\n class=\"hidden\"\n accept=\"image/*\"\n multiple\n (change)=\"inputFileChange($event)\">\n\n <div #inputText\n role=\"textbox\"\n class=\"message__input\"\n spellcheck=\"true\"\n contenteditable=\"true\"\n aria-multiline=\"true\"\n [attr.data-placeholder]=\"isEditMode()\n ? ('chat.edit_placeholder' | transloco)\n : ('chat.placeholder' | transloco)\"\n (blur)=\"onBlur()\"\n (focus)=\"onFocus()\"\n (input)=\"onInput()\"\n (paste)=\"onPaste()\"\n (keydown)=\"onKeyDown($event)\">\n </div>\n\n <div #mirror class=\"message__input-mirror\" aria-hidden=\"true\"></div>\n\n <ng-content></ng-content>\n </div>\n\n <button class=\"message__button message__button--send\"\n type=\"button\"\n (click)=\"enterDown()\"\n [attr.aria-label]=\"'chat.send' | transloco\"\n [disabled]=\"!canSend()\">\n <img ngSrc=\"assets/ngx-parl/icons/send.svg\"\n class=\"message__icon message__icon--send\"\n width=\"18\" height=\"18\" alt=\"hide\"/>\n\n </button>\n </div>\n\n @if (previews().length) {\n <div class=\"message__files\">\n @for (item of previews(); track $index) {\n <div class=\"message__file\" [attr.data-kind]=\"item.originalKind\">\n <button type=\"button\"\n class=\"message__file-remove\"\n [attr.aria-label]=\"'chat.delete_file' | transloco\"\n (click)=\"removeFile($index, $event)\">\n <img ngSrc=\"assets/ngx-parl/icons/remove.svg\"\n class=\"message__icon message__icon--file\"\n width=\"18\" height=\"18\" alt=\"hide\"/>\n </button>\n\n <div class=\"message__file-media\" (click)=\"openPreview(item, $index)\">\n <img [src]=\"item.src\" [alt]=\"item.name\" class=\"message__file-img\"/>\n\n @if (item.originalKind === FileType.GIF) {\n <span class=\"message__file-badge message__file-badge--gif\">\n {{ 'chat.gif' | transloco }}\n </span>\n }\n </div>\n </div>\n }\n </div>\n }\n</section>\n\n\n","export enum FlowTheme {\n PRIMARY = 'primary',\n SECONDARY = 'secondary',\n}\n","import {AfterViewInit, Component, computed, effect, input, model, OnDestroy, Optional, ViewChild} from '@angular/core';\nimport {NgClass, NgOptimizedImage} from '@angular/common';\nimport {ChatFlowComponent} from '../chat-flow/chat-flow';\nimport {MatDialogContent, MatDialogRef, MatDialogTitle} from '@angular/material/dialog';\nimport {\n ChatMessage,\n ChatMessageDTO,\n ChatMessageType,\n CurrMessage,\n MessageActionEvent,\n MessageType\n} from '../core/entity/chat';\nimport {MatProgressSpinner} from '@angular/material/progress-spinner';\nimport {InputMessageComponent} from '../input-message/input-message';\nimport {\n TranslocoModule,\n TranslocoPipe,\n TranslocoService,\n} from '@ngneat/transloco';\nimport {UtilsService} from '../core/service/utils/utils';\nimport {FlowTheme} from '../core/entity/theme';\nimport {Subscription} from 'rxjs';\n\n@Component({\n selector: 'ngx-parl',\n standalone: true,\n imports: [\n NgOptimizedImage, NgClass, MatDialogContent, MatDialogTitle, MatProgressSpinner, ChatFlowComponent, InputMessageComponent,\n TranslocoModule,\n TranslocoPipe\n ],\n templateUrl: './ngx-parl.html',\n styleUrl: './ngx-parl.scss',\n providers: [],\n})\nexport class NgxParlComponent implements AfterViewInit, OnDestroy {\n @ViewChild(ChatFlowComponent) chatFlow?: ChatFlowComponent;\n @ViewChild(InputMessageComponent) inputMessage?: InputMessageComponent;\n\n public ai_run_in_progress = false;\n public dragActive = model<boolean>(false);\n private dragDepth = 0;\n private lastUpdateKey: string | null = null;\n\n public theme = input<FlowTheme>(FlowTheme.PRIMARY);\n public header = input<boolean>(true);\n public language = input<'en' | 'uk'>('en');\n\n public messageList = model<ChatMessage[]>([]);\n public messageUpdate = model<ChatMessage>();\n public selectedForEdit = model<ChatMessage | null>(null);\n public messageAction = model<MessageActionEvent | null>(null);\n\n public incomingUser = input<string>('');\n public transportType = input<string>('');\n public transportTypeIcon = input<string>('');\n public transportTypeIconSrc = computed(() => this.utils.normalizeSourcePath(this.transportTypeIcon()));\n\n public hideHandler = input<(() => unknown) | null>(null);\n public closeHandler = input<(() => unknown) | null>(null);\n\n public scrollToBottomTrigger = model<number>(0);\n public loadHistory = model<boolean>(false);\n private focusTimers: number[] = [];\n private afterOpenedSubscription?: Subscription;\n\n constructor(private utils: UtilsService,\n private transloco: TranslocoService,\n @Optional() private dialogRef?: MatDialogRef<NgxParlComponent>) {\n effect(() => {\n this.transloco.setActiveLang(this.language());\n });\n\n effect(() => {\n const updatedMessage = this.messageUpdate();\n\n if (!updatedMessage) {\n return;\n }\n\n const key = `${updatedMessage.id}-${updatedMessage.cr_time}-${updatedMessage.type}`;\n if (this.lastUpdateKey === key) {\n return;\n }\n\n this.lastUpdateKey = key;\n\n this.messageList.update(list => {\n const index = list.findIndex(m => m.id === updatedMessage.id);\n\n if (index > -1) {\n const updated = [...list];\n updated[index] = updatedMessage;\n return updated;\n }\n\n return [...list, updatedMessage];\n });\n\n this.scrollToBottom();\n });\n }\n\n ngAfterViewInit() {\n if (this.dialogRef) {\n this.afterOpenedSubscription = this.dialogRef.afterOpened().subscribe(() => {\n this.queueInitialFocus();\n });\n } else {\n this.queueInitialFocus();\n }\n }\n\n ngOnDestroy() {\n this.focusTimers.forEach(timerId => clearTimeout(timerId));\n this.focusTimers = [];\n this.afterOpenedSubscription?.unsubscribe();\n }\n\n private queueInitialFocus() {\n const focusInputIfAppropriate = (allowStealingFocus: boolean) => {\n if (!this.inputMessage) {\n return;\n }\n if (!allowStealingFocus) {\n const activeElement = document.activeElement;\n if (activeElement && activeElement !== document.body) {\n return;\n }\n }\n\n this.inputMessage.focusInput();\n };\n\n const immediateTimerId = window.setTimeout(() => {\n focusInputIfAppropriate(true);\n }, 0);\n this.focusTimers.push(immediateTimerId);\n\n const delayedTimerId = window.setTimeout(() => {\n focusInputIfAppropriate(false);\n }, 200);\n\n this.focusTimers.push(delayedTimerId);\n }\n\n onCancelEdit(messageId: number | null) {\n if (messageId != null) {\n this.messageList.update(list => {\n const updated = [...list];\n const index = updated.findIndex(m => m.id === messageId);\n if (index > -1) {\n updated[index].edit = false;\n }\n return updated;\n });\n }\n\n this.selectedForEdit.set(null);\n\n return this;\n }\n\n onRequestDelete(messageId: number | null) {\n if (messageId == null) {\n return this;\n }\n\n this.messageList.update(list => list.filter(m => m.id !== messageId));\n\n this.pushMessageAction({\n action: 'delete',\n chatMessageId: messageId,\n content: '',\n });\n\n return this;\n }\n\n sendMessage(\n event:\n | CurrMessage\n | string\n | undefined\n ) {\n if (!event) {\n return this;\n }\n\n // edit message\n if (this.isCurrMessage(event) && event.id !== undefined) {\n const {id, content, file_path, file_list, user_id, user, transport_type, transport_type_icon} = event;\n\n this.messageList.update((currentList) => {\n const updatedList = [...currentList];\n const index = updatedList.findIndex(\n (message) => message.id === id,\n );\n\n if (index > -1) {\n updatedList[index].content = (content ?? '').trim();\n\n updatedList[index].file_path =\n Array.isArray(file_path) && file_path.length ? file_path : null;\n updatedList[index].file_list =\n Array.isArray(file_list) && file_list.length ? file_list : null;\n if (transport_type !== undefined) {\n updatedList[index].transport_type = transport_type ?? null;\n }\n if (transport_type_icon !== undefined) {\n updatedList[index].transport_type_icon = transport_type_icon ?? null;\n }\n\n updatedList[index].edit = false;\n }\n\n return updatedList;\n });\n\n this.selectedForEdit.set(null);\n\n this.pushMessageAction({\n action: 'edit',\n chatMessageId: id,\n content: (content ?? '').trim(),\n file_path: Array.isArray(file_path) && file_path.length ? file_path : [],\n file_list: Array.isArray(file_list) && file_list.length ? file_list : [],\n user_id: user_id,\n user: user,\n transport_type: transport_type ?? null,\n transport_type_icon: transport_type_icon ?? null,\n });\n\n return this;\n }\n\n // new message\n if (this.isCurrMessage(event)) {\n const hasFiles = Array.isArray(event.file_path) && event.file_path.length > 0;\n\n if (!hasFiles) {\n const {content, user_id, user, transport_type, transport_type_icon} = event;\n\n const messages = this.messageList();\n const lastId = messages.at(-1)?.id ?? 0;\n\n const lastOutgoing = [...messages]\n .reverse()\n .find((message) => message.type === MessageType.Outgoing,);\n const fallbackTransport = lastOutgoing?.transport_type ?? this.transportType() ?? null;\n const fallbackTransportIcon = lastOutgoing?.transport_type_icon ?? this.transportTypeIcon() ?? null;\n\n const dto: ChatMessageDTO = {\n id: lastId + 1,\n chat_id: lastOutgoing?.chat_id ?? 1,\n cr_time: this.utils.getLocalISODate(),\n type: MessageType.Outgoing as ChatMessageType,\n transport_type: transport_type ?? fallbackTransport,\n transport_type_icon: transport_type_icon ?? fallbackTransportIcon,\n user: lastOutgoing?.user ?? '',\n content: content,\n avatar: lastOutgoing?.avatar ?? null,\n file_path: [],\n file_list: [],\n checked: true,\n };\n\n this.messageList.update((list) => [...list, new ChatMessage(dto)]);\n this.scrollToBottomTrigger.update(v => v + 1);\n this.pushMessageAction({\n action: 'send',\n chatMessageId: dto.id,\n content: content,\n user_id: user_id,\n user: user,\n transport_type: dto.transport_type ?? null,\n transport_type_icon: dto.transport_type_icon ?? null,\n });\n\n return this;\n }\n }\n\n // new message + files\n if (!this.isCurrMessage(event)) {\n return this;\n }\n\n const {content, file_path, file_list, user_id, user, transport_type, transport_type_icon} = event;\n const text = (content ?? '').trim();\n const hasFiles = Array.isArray(file_path) && file_path.length > 0;\n const hasFileList = Array.isArray(file_list) && file_list.length > 0;\n\n if (!text && !hasFiles) {\n return this;\n }\n\n const messages = this.messageList();\n const lastId = messages.at(-1)?.id ?? 0;\n\n const lastOutgoing = [...messages]\n .reverse()\n .find((message) => message.type === MessageType.Outgoing,);\n const fallbackTransport = lastOutgoing?.transport_type ?? this.transportType() ?? null;\n const fallbackTransportIcon = lastOutgoing?.transport_type_icon ?? this.transportTypeIcon() ?? null;\n\n const dto: ChatMessageDTO = {\n id: lastId + 1,\n chat_id: lastOutgoing?.chat_id ?? 1,\n cr_time: this.utils.getLocalISODate(),\n type: MessageType.Outgoing as ChatMessageType,\n transport_type: transport_type ?? fallbackTransport,\n transport_type_icon: transport_type_icon ?? fallbackTransportIcon,\n user: lastOutgoing?.user ?? '',\n content: text,\n avatar: lastOutgoing?.avatar ?? null,\n file_path: hasFiles ? file_path : [],\n file_list: hasFileList ? file_list : [],\n checked: true,\n };\n\n this.messageList.update((list) => [...list, new ChatMessage(dto)]);\n this.scrollToBottomTrigger.update(v => v + 1);\n this.pushMessageAction({\n action: 'send',\n chatMessageId: dto.id,\n content: text,\n file_path: hasFiles ? file_path : [],\n file_list: hasFileList ? file_list : [],\n user_id: user_id,\n user: user,\n transport_type: dto.transport_type ?? null,\n transport_type_icon: dto.transport_type_icon ?? null,\n });\n\n return this;\n }\n\n isCurrMessage(event: unknown): event is CurrMessage {\n return typeof event === 'object' && event !== null && 'content' in event;\n }\n\n pushMessageAction(event: MessageActionEvent) {\n this.messageAction.set(event);\n setTimeout(() => this.messageAction.set(null), 0);\n return this;\n }\n\n scrollToBottom(): this {\n this.chatFlow?.scrollToBottom();\n\n return this;\n }\n\n onHideClick() {\n const handler = this.hideHandler();\n\n if (handler) {\n handler();\n }\n return this;\n }\n\n onCloseClick() {\n const handler = this.closeHandler();\n\n if (handler) {\n handler();\n }\n\n return this;\n }\n\n onDragOver(event: DragEvent) {\n event.preventDefault();\n event.stopPropagation();\n if (event.dataTransfer) {\n event.dataTransfer.dropEffect = 'copy';\n }\n this.dragActive.set(true);\n\n return this;\n }\n\n onDragEnter(event: DragEvent) {\n event.preventDefault();\n event.stopPropagation();\n this.dragDepth += 1;\n this.dragActive.set(true);\n\n return this;\n }\n\n onDragLeave(event: DragEvent) {\n event.preventDefault();\n event.stopPropagation();\n this.dragDepth = Math.max(0, this.dragDepth - 1);\n if (this.dragDepth === 0) {\n this.dragActive.set(false);\n }\n\n return this;\n }\n\n onDrop(event: DragEvent) {\n event.preventDefault();\n event.stopPropagation();\n this.dragDepth = 0;\n this.dragActive.set(false);\n\n const files = event.dataTransfer?.files;\n if (!files?.length) {\n return this;\n }\n\n this.inputMessage?.addFiles(Array.from(files));\n\n return this;\n }\n\n protected readonly FlowTheme = FlowTheme;\n}\n","<div class=\"modal-chat\" [ngClass]=\"'flow-theme-' + theme()\">\n <div class=\"modal-chat__body\">\n @if (header()) {\n <header class=\"modal-chat__header\" mat-dialog-title>\n <div class=\"modal-chat__hide-block\"></div>\n\n <div class=\"modal-chat__title\">\n <h1 class=\"modal-chat__heading\" id=\"modal-chat__heading\">\n @if (transportTypeIconSrc()) {\n <img [ngSrc]=\"transportTypeIconSrc()\"\n class=\"modal-chat__heading-icon\"\n width=\"20\"\n height=\"20\"\n [attr.alt]=\"transportType() || 'transport icon'\"/>\n }\n <span class=\"modal-chat__heading-text\">\n {{ transportType() }} {{ incomingUser() }}\n </span>\n </h1>\n </div>\n\n <div class=\"modal-chat__actions\">\n <img ngSrc=\"assets/ngx-parl/icons/hide.svg\" class=\"modal-chat__icon modal-chat__icon--hide\"\n width=\"24\" height=\"24\" alt=\"hide\"\n (click)=\"onHideClick()\"/>\n <img ngSrc=\"assets/ngx-parl/icons/close.svg\" class=\"modal-chat__icon modal-chat__icon--close\"\n width=\"24\" height=\"24\" alt=\"close\"\n (click)=\"onCloseClick()\"/>\n </div>\n </header>\n }\n\n <mat-dialog-content class=\"modal-chat__content\"\n [class.modal-chat__content--header]=\"header() === false\"\n [class.modal-chat__content--dragover]=\"dragActive()\"\n (dragenter)=\"onDragEnter($event)\"\n (dragover)=\"onDragOver($event)\"\n (dragleave)=\"onDragLeave($event)\"\n (drop)=\"onDrop($event)\">\n @if (dragActive()) {\n <div class=\"modal-chat__drag-overlay\"\n role=\"status\"\n aria-live=\"polite\"\n [attr.aria-label]=\"'chat.drag_title' | transloco\">\n <div class=\"modal-chat__drag-card\">\n <img ngSrc=\"assets/ngx-parl/icons/attach-filled.svg\"\n class=\"modal-chat__drag-icon\"\n alt=\"\"\n width=\"56\"\n height=\"56\"/>\n\n <div class=\"modal-chat__drag-title\">\n {{ 'chat.drag_title' | transloco }}\n </div>\n <div class=\"modal-chat__drag-subtitle\">\n {{ 'chat.drag_subtitle' | transloco }}\n </div>\n </div>\n </div>\n }\n <app-chat-flow [messageListInput]=\"messageList()\"\n [(selectedForEdit)]=\"selectedForEdit\"\n (requestDeleteChange)=\"onRequestDelete($event)\"\n [(scrollToBottomTrigger)]=\"scrollToBottomTrigger\"\n [(loadHistory)]=\"loadHistory\">\n </app-chat-flow>\n\n <app-input-message [editMessage]=\"selectedForEdit()\"\n (cancelEditChange)=\"onCancelEdit($event)\"\n (input_textChange)=\"sendMessage($event)\">\n @if (ai_run_in_progress) {\n <mat-spinner [diameter]=\"30\"></mat-spinner>\n }\n </app-input-message>\n </mat-dialog-content>\n </div>\n</div>\n","import { Injectable } from '@angular/core';\nimport { TranslocoLoader, Translation } from '@ngneat/transloco';\nimport { Observable, of } from 'rxjs';\n\nimport en from '../../assets/i18n/en.json';\nimport uk from '../../assets/i18n/uk.json';\n\n@Injectable()\nexport class ParlTranslocoLoader implements TranslocoLoader {\n getTranslation(lang: string): Observable<Translation> {\n switch (lang) {\n case 'uk':\n return of(uk as Translation);\n case 'en':\n default:\n return of(en as Translation);\n }\n }\n}\n","import { isDevMode } from '@angular/core';\nimport { provideTransloco } from '@ngneat/transloco';\nimport { ParlTranslocoLoader } from '../assets/i18n/parl-transloco.loader';\n\nexport function provideNgxParl() {\n return provideTransloco({\n config: {\n availableLangs: ['en', 'uk'],\n defaultLang: 'en',\n reRenderOnLangChange: true,\n prodMode: !isDevMode(),\n },\n loader: ParlTranslocoLoader,\n });\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.UtilsService"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"trixwell-ngx-parl.mjs","sources":["../../../projects/ngx-parl/src/lib/core/entity/chat.ts","../../../projects/ngx-parl/src/lib/core/components/preview-file/preview-file.ts","../../../projects/ngx-parl/src/lib/core/components/preview-file/preview-file.html","../../../projects/ngx-parl/src/lib/core/service/utils/utils.ts","../../../projects/ngx-parl/src/lib/core/components/chat-message/chat-message.ts","../../../projects/ngx-parl/src/lib/core/components/chat-message/chat-message.html","../../../projects/ngx-parl/src/lib/core/pipes/toggle-display-chat-start-day-pipe.ts","../../../projects/ngx-parl/src/lib/core/pipes/chat-start-day-pipe.ts","../../../projects/ngx-parl/src/lib/chat-flow/chat-flow.ts","../../../projects/ngx-parl/src/lib/chat-flow/chat-flow.html","../../../projects/ngx-parl/src/lib/core/entity/file.ts","../../../projects/ngx-parl/src/lib/input-message/input-message.ts","../../../projects/ngx-parl/src/lib/input-message/input-message.html","../../../projects/ngx-parl/src/lib/core/entity/theme.ts","../../../projects/ngx-parl/src/lib/ngx-parl/ngx-parl.ts","../../../projects/ngx-parl/src/lib/ngx-parl/ngx-parl.html","../../../projects/ngx-parl/src/assets/i18n/parl-transloco.loader.ts","../../../projects/ngx-parl/src/lib/ngx-parl.providers.ts","../../../projects/ngx-parl/src/trixwell-ngx-parl.ts"],"sourcesContent":["export class ChatMessage {\n public id: number;\n public chat_id: number;\n public cr_time: string;\n public type: ChatMessageType;\n public transport_type: string | null;\n public transport_type_icon: string | null;\n public user: string;\n public content: string;\n public avatar: string | null;\n public file_path: string[] | null;\n public file_list: File[] | null;\n\n public checked: boolean | null;\n public edit = false;\n public pending = false;\n\n constructor(data: ChatMessageDTO) {\n this.id = data.id;\n this.chat_id = data.chat_id;\n this.cr_time = data.cr_time;\n this.type = data.type;\n this.transport_type = data.transport_type ?? null;\n this.transport_type_icon = data.transport_type_icon ?? null;\n this.user = data.user;\n this.content = data.content;\n this.avatar = data.avatar ?? null;\n this.checked = data.checked ?? null;\n this.pending = data.pending ?? false;\n this.file_path = data.file_path ?? null;\n this.file_list = data.file_list ?? null;\n }\n\n get dateSimple(): string {\n const d = new Date(this.cr_time.replace(' ', 'T'));\n const dd = String(d.getDate()).padStart(2, '0');\n const mm = String(d.getMonth() + 1).padStart(2, '0');\n const yyyy = d.getFullYear();\n return `${dd}.${mm}.${yyyy}`;\n }\n\n get timeHHmm(): string {\n const d = new Date(this.cr_time.replace(' ', 'T'));\n const hh = String(d.getHours()).padStart(2, '0');\n const mm = String(d.getMinutes()).padStart(2, '0');\n return `${hh}:${mm}`;\n }\n}\n\nexport interface ChatMessageDTO {\n id: number;\n chat_id: number;\n cr_time: string; // ISO or 'YYYY-MM-DD HH:mm:ss'\n type: ChatMessageType;\n transport_type?: string | null;\n transport_type_icon?: string | null;\n user: string;\n content: string;\n avatar?: string | null;\n file_path?: string[] | [] | null;\n file_list?: File[] | [] | null;\n checked?: boolean | null;\n pending?: boolean;\n}\n\nexport type ChatMessageType = 'incoming' | 'outgoing';\n\nexport enum MessageType {\n Incoming = 'incoming',\n Outgoing = 'outgoing'\n}\n\nexport interface CurrMessage {\n id?: number;\n content: string;\n file_path?: string[];\n file_list?: File[];\n user_id?: number;\n user?: string;\n transport_type?: string | null;\n transport_type_icon?: string | null;\n}\n\nexport type MessageActionType = 'send' | 'edit' | 'delete';\n\nexport interface MessageActionEvent {\n action: MessageActionType;\n chatMessageId?: number;\n content: string;\n file_path?: string[];\n file_list?: File[];\n user_id?: number;\n user?: string;\n transport_type?: string | null;\n transport_type_icon?: string | null;\n}\n","import {\n Component,\n ElementRef,\n ViewChild,\n computed,\n effect,\n input,\n model,\n inject,\n OnDestroy,\n AfterViewInit\n} from '@angular/core';\nimport {TranslocoPipe} from '@ngneat/transloco';\nimport {FocusTrap, FocusTrapFactory} from '@angular/cdk/a11y';\n\n@Component({\n selector: 'lib-preview-file',\n imports: [\n TranslocoPipe,\n ],\n templateUrl: './preview-file.html',\n styleUrl: './preview-file.scss',\n standalone: true,\n})\nexport class PreviewFile implements OnDestroy, AfterViewInit {\n public srcList = input<string[]>([]);\n public startIndex = input<number>(0);\n public title = input<string>('');\n public openerElement = input<HTMLElement | null>(null);\n public closeHandler = input<(() => unknown) | null>(null);\n public focusTrapFactory = inject(FocusTrapFactory);\n\n public activeIndex = model<number>(0);\n public viewReady = model<boolean>(false);\n public userNavigated = model<boolean>(false);\n public previousListLength = model<number>(0);\n public focusTrap: FocusTrap | null = null;\n\n @ViewChild('dialog') public dialogElement?: ElementRef<HTMLElement>;\n @ViewChild('closeButton') public closeButton?: ElementRef<HTMLButtonElement>;\n\n public currentSrc = computed(() => {\n const list = this.srcList();\n const index = this.activeIndex();\n\n return list[index] ?? '';\n });\n\n constructor() {\n effect(() => {\n const list = this.srcList();\n const initial = this.startIndex();\n const maxIndex = Math.max(0, list.length - 1);\n const currentIndex = this.activeIndex();\n const lengthChanged = this.previousListLength() !== list.length;\n\n if (!list.length) {\n this.activeIndex.set(0);\n this.userNavigated.set(false);\n this.previousListLength.set(0);\n return;\n }\n\n if (currentIndex > maxIndex) {\n this.activeIndex.set(maxIndex);\n this.previousListLength.set(list.length);\n return;\n }\n\n if (!this.userNavigated() || lengthChanged) {\n const nextIndex = Math.max(0, Math.min(initial, maxIndex));\n this.activeIndex.set(nextIndex);\n }\n\n this.previousListLength.set(list.length);\n\n });\n\n effect(() => {\n const isOpen = this.srcList().length > 0;\n const isReady = this.viewReady();\n\n if (!isReady) {\n return;\n }\n\n if (isOpen) {\n queueMicrotask(() => this.activateFocus());\n return;\n }\n\n this.destroyFocusTrap();\n });\n }\n\n ngAfterViewInit() {\n this.viewReady.set(true);\n }\n\n ngOnDestroy() {\n this.destroyFocusTrap();\n }\n\n requestClose() {\n const handler = this.closeHandler();\n if (handler) {\n handler();\n }\n\n this.restoreFocus();\n\n return this;\n }\n\n onKeyDown(event: KeyboardEvent) {\n if (event.key === 'Escape') {\n return this.requestClose();\n }\n if (event.key === 'ArrowRight') {\n return this.next();\n }\n if (event.key === 'ArrowLeft') {\n return this.prev();\n }\n return this;\n }\n\n prev() {\n const list = this.srcList();\n if (list.length < 2) {\n return this;\n }\n const nextIndex = (this.activeIndex() - 1 + list.length) % list.length;\n this.activeIndex.set(nextIndex);\n this.userNavigated.set(true);\n\n return this;\n }\n\n next() {\n const list = this.srcList();\n if (list.length < 2) {\n return this;\n }\n const nextIndex = (this.activeIndex() + 1) % list.length;\n this.activeIndex.set(nextIndex);\n this.userNavigated.set(true);\n\n return this;\n }\n\n select(index: number) {\n const list = this.srcList();\n if (!list.length) {\n return this;\n }\n\n const nextIndex = Math.max(0, Math.min(index, list.length - 1));\n this.activeIndex.set(nextIndex);\n this.userNavigated.set(true);\n\n return this;\n }\n\n activateFocus() {\n const dialog = this.dialogElement?.nativeElement;\n if (!dialog) {\n return this;\n }\n\n if (!this.focusTrap) {\n this.focusTrap = this.focusTrapFactory.create(dialog);\n }\n\n const closeButton = this.closeButton?.nativeElement;\n if (closeButton) {\n closeButton.focus();\n return this;\n }\n\n dialog.focus();\n return this;\n }\n\n destroyFocusTrap() {\n if (this.focusTrap) {\n this.focusTrap.destroy();\n this.focusTrap = null;\n }\n return this;\n }\n\n restoreFocus() {\n const opener = this.openerElement();\n if (opener) {\n queueMicrotask(() => opener.focus());\n }\n return this;\n }\n}\n","<div class=\"preview\" (click)=\"requestClose()\">\n <div class=\"preview__dialog\"\n #dialog\n tabindex=\"-1\"\n role=\"dialog\"\n aria-modal=\"true\"\n [attr.aria-label]=\"title() || ('chat.photo_preview' | transloco)\"\n (keydown)=\"onKeyDown($event)\"\n (click)=\"$event.stopPropagation()\">\n <div class=\"preview__header\">\n <h3 class=\"preview__title\">\n {{ title() || ('chat.photo_preview' | transloco) }}\n </h3>\n <button type=\"button\"\n class=\"preview__close\"\n [attr.aria-label]=\"'chat.close' | transloco\"\n #closeButton\n (click)=\"requestClose()\">\n <span class=\"preview__close-icon\" aria-hidden=\"true\"></span>\n </button>\n </div>\n <div class=\"preview__body\">\n @if (srcList().length > 1) {\n <button type=\"button\"\n class=\"preview__nav preview__nav--prev\"\n [attr.aria-label]=\"'chat.previous' | transloco\"\n (click)=\"prev()\">\n </button>\n <button type=\"button\"\n class=\"preview__nav preview__nav--next\"\n [attr.aria-label]=\"'chat.next' | transloco\"\n (click)=\"next()\">\n </button>\n }\n <img [src]=\"currentSrc()\"\n [attr.alt]=\"'chat.photo_preview_image_x_of_y' | transloco : { index: activeIndex() + 1, total: srcList().length }\"\n class=\"preview__image\"\n (click)=\"next()\"\n (keydown.enter)=\"$event.preventDefault(); next()\"\n (keydown.space)=\"$event.preventDefault(); next()\"/>\n </div>\n @if (srcList().length > 1) {\n <div class=\"preview__thumbs\">\n @for (file of srcList(); track file; let i = $index) {\n <button type=\"button\"\n class=\"preview__thumb\"\n [class.preview__thumb--active]=\"i === activeIndex()\"\n (click)=\"select(i)\">\n <img [src]=\"file\"\n [attr.alt]=\"'chat.thumbnail_alt' | transloco : { index: i + 1, total: srcList().length }\"/>\n </button>\n }\n </div>\n }\n </div>\n</div>\n","import {Injectable} from '@angular/core';\nimport {HttpClient} from '@angular/common/http';\n\n\n@Injectable({\n providedIn: 'root'\n})\nexport class UtilsService {\n\n constructor(protected http: HttpClient) {\n }\n\n langToLocale(lang: string): string {\n switch (lang) {\n case 'uk':\n return 'uk-UA';\n case 'en':\n default:\n return 'en-US';\n }\n }\n\n getLocalISODate(): string {\n const d = new Date();\n\n const year = d.getFullYear();\n const month = String(d.getMonth() + 1).padStart(2, '0');\n const day = String(d.getDate()).padStart(2, '0');\n\n const hours = String(d.getHours()).padStart(2, '0');\n const minutes = String(d.getMinutes()).padStart(2, '0');\n const seconds = String(d.getSeconds()).padStart(2, '0');\n\n return `${year}-${month}-${day}T${hours}:${minutes}:${seconds}`;\n }\n\n normalizeSourcePath(sourcePath: string): string {\n const cleanedPath = (sourcePath ?? '').trim();\n if (!cleanedPath) {\n return '';\n }\n\n if (cleanedPath.startsWith('data:') || cleanedPath.startsWith('blob:') || /^https?:\\/\\//i.test(cleanedPath)) {\n return cleanedPath;\n }\n\n const assetsIndex = cleanedPath.indexOf('assets/');\n if (assetsIndex >= 0) {\n return '/' + cleanedPath.slice(assetsIndex);\n }\n\n return cleanedPath.replace(/^\\.{1,2}\\//, '/');\n }\n}\n","import {Component, computed, input, model} from '@angular/core';\nimport {DatePipe, NgClass, NgOptimizedImage} from '@angular/common';\nimport {ChatMessage, MessageType} from '../../entity/chat';\nimport {MatMenu, MatMenuItem, MatMenuTrigger} from '@angular/material/menu';\nimport {TranslocoPipe} from '@ngneat/transloco';\nimport {PreviewFile} from '../preview-file/preview-file';\nimport {UtilsService} from '../../service/utils/utils';\n\n@Component({\n selector: 'lib-chat-message',\n imports: [\n NgClass,\n NgOptimizedImage,\n DatePipe,\n MatMenu,\n MatMenuItem,\n MatMenuTrigger,\n TranslocoPipe,\n PreviewFile,\n ],\n templateUrl: './chat-message.html',\n styleUrl: './chat-message.scss',\n standalone: true,\n})\n\nexport class ChatMessageComponent {\n public currentMessage = input.required<ChatMessage>();\n public edit = model<boolean>(false);\n public previewList = model<string[]>([]);\n public previewIndex = model<number>(0);\n public previewOpener = model<HTMLElement | null>(null);\n public closePreviewHandler = () => this.closePreview();\n\n public requestEdit = model<ChatMessage | null>(null);\n public requestDelete = model<number | null>(null);\n\n constructor(private utils: UtilsService) {}\n\n attachments = computed(() => {\n const message = this.currentMessage();\n const filePath = message.file_path;\n\n if (Array.isArray(filePath)) {\n return filePath.map(p => this.utils.normalizeSourcePath(p)).filter(Boolean);\n }\n\n const rawFilePath = (filePath as unknown as string) ?? '';\n if (typeof rawFilePath !== 'string' || !rawFilePath.trim) {\n return [];\n }\n\n if (rawFilePath.trim().startsWith('[')) {\n try {\n const parsed = JSON.parse(rawFilePath);\n if (Array.isArray(parsed)) {\n return parsed\n .map(item => (typeof item === 'string' ? this.utils.normalizeSourcePath(item) : ''))\n .filter(Boolean);\n }\n } catch {}\n }\n\n if (rawFilePath.startsWith('data:')) {\n return [rawFilePath];\n }\n\n if (rawFilePath.includes('|')) {\n return rawFilePath.split('|').map(p => this.utils.normalizeSourcePath(p)).filter(Boolean);\n }\n if (rawFilePath.includes(',')) {\n return rawFilePath.split(',').map(p => this.utils.normalizeSourcePath(p)).filter(Boolean);\n }\n\n return [];\n });\n\n avatarSrc = computed(() => {\n const message = this.currentMessage();\n const fallback = message.type === 'incoming'\n ? 'assets/ngx-parl/icons/avatar_anonym.svg'\n : 'assets/ngx-parl/icons/avatar_manager.svg';\n\n return message.avatar || fallback;\n });\n\n openContextMenu(event: Event, trigger: MatMenuTrigger, triggerElement: HTMLElement) {\n event.preventDefault();\n event.stopPropagation();\n\n if (event instanceof MouseEvent) {\n triggerElement.style.setProperty('inset-inline-start', `${event.clientX}px`);\n triggerElement.style.setProperty('inset-block-start', `${event.clientY}px`);\n triggerElement.style.removeProperty('left');\n triggerElement.style.removeProperty('top');\n }\n\n trigger.openMenu();\n\n return this;\n }\n\n editMessage(message: ChatMessage) {\n this.edit.set(true);\n this.requestEdit.set(message);\n\n return this;\n }\n\n openPreview(index: number, event: MouseEvent) {\n const list = this.attachments();\n if (!list.length) {\n return this;\n }\n\n const opener = event.currentTarget instanceof HTMLElement ? event.currentTarget : null;\n this.previewOpener.set(opener);\n this.previewList.set(list);\n this.previewIndex.set(Math.max(0, Math.min(index, list.length - 1)));\n\n return this;\n }\n\n closePreview() {\n this.previewList.set([]);\n this.previewIndex.set(0);\n this.previewOpener.set(null);\n\n return this;\n }\n\n deleteMessage(message: ChatMessage) {\n this.requestDelete.set(message.id);\n queueMicrotask(() => this.requestDelete.set(null));\n\n return this;\n }\n\n canDelete(message: ChatMessage): boolean {\n return message.type === this.messageType.Outgoing;\n }\n\n public readonly messageType = MessageType;\n}\n","<div class=\"message\"\n [ngClass]=\"{\n 'message--outgoing': currentMessage().type === messageType.Outgoing,\n 'message--incoming': currentMessage().type === messageType.Incoming\n }\">\n <div class=\"message__avatar\">\n <img [ngSrc]=\"avatarSrc()\" width=\"36\" height=\"36\" alt=\"avatar\"/>\n </div>\n\n <div class=\"message__body\"\n [class.message__body--attachments-1]=\"attachments().length === 1\"\n [class.message__body--attachments-2]=\"attachments().length === 2\"\n [class.message__body--attachments-3]=\"attachments().length >= 3\"\n (contextmenu)=\"openContextMenu($event, menuTrigger, menuTriggerEl)\"\n (keydown.shift.F10)=\"$event.preventDefault(); menuTrigger.openMenu()\">\n <button type=\"button\"\n class=\"message__menu-trigger\"\n aria-hidden=\"true\"\n tabindex=\"-1\"\n #menuTrigger=\"matMenuTrigger\"\n #menuTriggerEl\n [matMenuTriggerFor]=\"messageMenu\"\n >\n </button>\n\n @if (attachments().length) {\n <div class=\"message__attachments\">\n @for (file of attachments(); track file; let i = $index) {\n <button type=\"button\"\n class=\"message__image-button\"\n (click)=\"openPreview(i, $event)\"\n [attr.aria-label]=\"'chat.photo_preview' | transloco\">\n <img [src]=\"file\"\n alt=\"attachment\"\n class=\"message__image\"\n loading=\"lazy\"/>\n </button>\n }\n </div>\n }\n\n <div class=\"message__bubble\" tabindex=\"0\">\n <div class=\"message__text\">{{ currentMessage().content }}</div>\n\n <div class=\"message__meta\">\n <time class=\"message__time\">\n {{ currentMessage().cr_time | date:'HH:mm' }}\n </time>\n @if (currentMessage().type === messageType.Outgoing) {\n @if (currentMessage().pending) {\n <span class=\"message__loading\" aria-label=\"Sending\"></span>\n } @else if (currentMessage().checked) {\n <img ngSrc=\"assets/ngx-parl/icons/checked-message.svg\"\n class=\"message__icon\"\n width=\"18\" height=\"18\" alt=\"hide\"/>\n } @else {\n <img ngSrc=\"assets/ngx-parl/icons/no-check.svg\"\n class=\"message__icon\"\n width=\"18\" height=\"18\" alt=\"hide\"/>\n }\n }\n </div>\n </div>\n </div>\n</div>\n<div class=\"message__user\">\n @if (currentMessage().type === messageType.Outgoing) {\n <span class=\"message__user-name\">{{ currentMessage().user }}</span>\n }\n</div>\n\n@if (previewList().length) {\n <lib-preview-file\n [srcList]=\"previewList()\"\n [startIndex]=\"previewIndex()\"\n [openerElement]=\"previewOpener()\"\n [closeHandler]=\"closePreviewHandler\">\n </lib-preview-file>\n}\n\n<mat-menu #messageMenu=\"matMenu\" yPosition=\"below\" xPosition=\"before\" class=\"message__menu\">\n @if (currentMessage().type === messageType.Outgoing) {\n <button mat-menu-item (click)=\"editMessage(currentMessage())\">\n <img ngSrc=\"assets/ngx-parl/icons/icon-edit.svg\"\n class=\"message__icon--menu\"\n width=\"20\" height=\"20\" alt=\"hide\"/>\n <span>{{ 'chat.edit' | transloco }}</span>\n </button>\n }\n @if (canDelete(currentMessage())) {\n <button mat-menu-item (click)=\"deleteMessage(currentMessage())\">\n <img ngSrc=\"assets/ngx-parl/icons/trash.svg\"\n class=\"message__icon--menu\"\n width=\"20\" height=\"20\" alt=\"hide\"/>\n <span>{{ 'chat.remove' | transloco }}</span>\n </button>\n }\n</mat-menu>\n","import {Pipe, PipeTransform} from '@angular/core';\nimport {DatePipe} from '@angular/common';\nimport {ChatMessage} from '../entity/chat';\nimport {UtilsService} from '../service/utils/utils';\nimport {TranslocoService} from '@ngneat/transloco';\n\n@Pipe({\n name: 'toggleDisplayChatStartDay'\n})\nexport class ToggleDisplayChatStartDayPipe implements PipeTransform {\n\n constructor(protected utils: UtilsService, private transloco: TranslocoService) {}\n\n transform(message: ChatMessage, messages: ChatMessage[], i: number): boolean {\n const locale = this.utils.langToLocale(this.transloco.getActiveLang());\n const datePipe = new DatePipe(locale);\n\n const prev = i > 0 ? messages[i - 1] : undefined;\n\n const currDay = datePipe.transform(new Date(message.cr_time), 'shortDate');\n const prevDay = prev ? datePipe.transform(new Date(prev.cr_time), 'shortDate') : undefined;\n\n return prev ? currDay !== prevDay : true;\n }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\nimport {DatePipe} from '@angular/common';\nimport {UtilsService} from '../service/utils/utils';\nimport {TranslocoService} from '@ngneat/transloco';\n\n@Pipe({\n name: 'chatStartDay'\n})\nexport class ChatStartDayPipe implements PipeTransform {\n constructor(protected utils: UtilsService, private transloco: TranslocoService) {}\n\n transform(value: string, format: string = 'd MMMM'): string {\n if (!value) {\n return '';\n }\n\n const locale = this.utils.langToLocale(this.transloco.getActiveLang());\n const datePipe = new DatePipe(locale);\n\n const valueDate = new Date(value);\n const today = new Date();\n\n const isToday = datePipe.transform(valueDate, 'shortDate') === datePipe.transform(today, 'shortDate');\n\n return isToday\n ? (locale.startsWith('uk') ? 'Сьогодні' : 'Today')\n : (datePipe.transform(valueDate, format) ?? '');\n }\n\n}\n","import {\n AfterViewInit,\n Component,\n computed,\n effect,\n ElementRef,\n model,\n OnDestroy,\n signal,\n ViewChild,\n} from '@angular/core';\nimport {FormsModule} from '@angular/forms';\nimport {ChatMessage} from '../core/entity/chat';\nimport {ChatMessageComponent} from '../core/components/chat-message/chat-message';\nimport {TranslocoPipe} from '@ngneat/transloco';\nimport {NgOptimizedImage} from '@angular/common';\nimport {InfiniteScrollDirective} from 'ngx-infinite-scroll';\nimport {ToggleDisplayChatStartDayPipe} from '../core/pipes/toggle-display-chat-start-day-pipe';\nimport {ChatStartDayPipe} from '../core/pipes/chat-start-day-pipe';\n\n@Component({\n selector: 'app-chat-flow',\n imports: [\n FormsModule,\n ChatMessageComponent,\n TranslocoPipe,\n NgOptimizedImage,\n InfiniteScrollDirective,\n ToggleDisplayChatStartDayPipe,\n ChatStartDayPipe\n ],\n templateUrl: './chat-flow.html',\n styleUrl: './chat-flow.scss',\n standalone: true,\n})\n\nexport class ChatFlowComponent implements AfterViewInit, OnDestroy {\n @ViewChild('chatFlowRef') flowRef?: ElementRef<HTMLElement>;\n\n public scrollToBottomTrigger = model<number>(0);\n public loadHistory = model<boolean>(false);\n\n public messageListInput = model.required<ChatMessage[]>();\n public messageList = computed(() => this.messageListInput());\n\n public selectedForEdit = model.required<ChatMessage | null>();\n public requestDelete = model<number | null>(null);\n\n private viewInitialized = false;\n private previousMessageCount = 0;\n private previousFirstMessageId: number | null = null;\n private previousLastMessageId: number | null = null;\n private pendingHistoryRestore = false;\n\n private previousScrollHeight = 0;\n private previousScrollTop = 0;\n private isUserAtBottom = true;\n private resizeObserver: ResizeObserver | null = null;\n\n public showScrollToBottom = signal(false);\n\n public historyLoadThreshold = signal(1);\n\n constructor() {\n effect(() => {\n const messages = this.messageList();\n const firstMessageId = messages[0]?.id ?? null;\n const lastMessageId = messages.at(-1)?.id ?? null;\n\n if (!this.viewInitialized) {\n this.previousMessageCount = messages.length;\n this.previousFirstMessageId = firstMessageId;\n this.previousLastMessageId = lastMessageId;\n return;\n }\n\n const hasMoreMessages = messages.length > this.previousMessageCount;\n const hasFewerMessages = messages.length < this.previousMessageCount;\n const hasPrependedMessages =\n hasMoreMessages &&\n this.previousFirstMessageId !== null &&\n firstMessageId !== this.previousFirstMessageId;\n const hasAppendedMessages =\n hasMoreMessages &&\n this.previousLastMessageId !== null &&\n lastMessageId !== this.previousLastMessageId;\n\n const shouldRestoreHistory =\n !this.isUserAtBottom &&\n hasMoreMessages &&\n (hasPrependedMessages || (this.pendingHistoryRestore && !hasAppendedMessages));\n\n if (shouldRestoreHistory) {\n this.restoreScrollAfterHistoryPrepend();\n this.pendingHistoryRestore = false;\n }\n\n if (hasMoreMessages && this.isUserAtBottom) {\n queueMicrotask(() => this.scrollToBottom());\n }\n\n if (hasMoreMessages && hasAppendedMessages && !hasPrependedMessages) {\n this.pendingHistoryRestore = false;\n }\n\n if (hasFewerMessages) {\n this.pendingHistoryRestore = true;\n queueMicrotask(() => this.loadHistory.set(true));\n }\n\n this.previousMessageCount = messages.length;\n this.previousFirstMessageId = firstMessageId;\n this.previousLastMessageId = lastMessageId;\n });\n\n effect(() => {\n this.scrollToBottomTrigger();\n\n if (this.viewInitialized) {\n queueMicrotask(() => this.scrollToBottomSmooth());\n }\n });\n }\n\n ngAfterViewInit(): void {\n this.viewInitialized = true;\n\n const element = this.flowRef?.nativeElement;\n if (!element) {\n return;\n }\n\n element.addEventListener('scroll', () => {\n this.previousScrollHeight = element.scrollHeight;\n this.previousScrollTop = element.scrollTop;\n\n this.isUserAtBottom =\n element.scrollTop + element.clientHeight >=\n element.scrollHeight - 10;\n this.showScrollToBottom.set(!this.isUserAtBottom);\n });\n\n queueMicrotask(() => this.scrollToBottom());\n\n this.observeScrollContainerForEmptySpace(element);\n }\n\n onScrollUp(): this {\n this.pendingHistoryRestore = true;\n this.loadHistory.set(true);\n\n setTimeout(() => this.loadHistory.set(false), 0);\n\n return this;\n }\n\n restoreScrollAfterHistoryPrepend(): this {\n const element = this.flowRef?.nativeElement;\n if (!element) {\n return this;\n }\n\n const savedScrollTop = this.previousScrollTop;\n const savedScrollHeight = this.previousScrollHeight;\n\n queueMicrotask(() => {\n const newScrollHeight = element.scrollHeight;\n const heightDiff = newScrollHeight - savedScrollHeight;\n const previousBehavior = element.style.scrollBehavior;\n element.style.scrollBehavior = 'auto';\n element.scrollTop = savedScrollTop + heightDiff;\n element.style.scrollBehavior = previousBehavior;\n });\n\n return this;\n }\n\n scrollToBottomSmooth(): this {\n const element = this.flowRef?.nativeElement;\n if (!element) {\n return this;\n }\n\n element.scrollTo({\n top: element.scrollHeight,\n behavior: 'smooth',\n });\n this.isUserAtBottom = true;\n this.showScrollToBottom.set(false);\n\n return this;\n }\n\n scrollToBottom(): this {\n const element = this.flowRef?.nativeElement;\n if (!element) {\n return this;\n }\n\n element.scrollTop = element.scrollHeight;\n this.isUserAtBottom = true;\n this.showScrollToBottom.set(false);\n return this;\n }\n\n private observeScrollContainerForEmptySpace(element: HTMLElement): void {\n const checkAndLoadIfNeeded = () => {\n if (\n this.messageList().length > 0 &&\n element.scrollHeight <= element.clientHeight + 10 &&\n !this.loadHistory()\n ) {\n this.pendingHistoryRestore = true;\n this.loadHistory.set(true);\n }\n };\n\n this.resizeObserver = new ResizeObserver(() => {\n requestAnimationFrame(checkAndLoadIfNeeded);\n });\n\n this.resizeObserver.observe(element);\n }\n\n ngOnDestroy(): void {\n this.resizeObserver?.disconnect();\n this.resizeObserver = null;\n }\n\n startEdit(message: ChatMessage): this {\n this.messageList().forEach(current => {\n if (current.id !== message.id && current.edit) {\n current.edit = false;\n }\n });\n\n message.edit = true;\n\n if (this.selectedForEdit()?.id === message.id) {\n this.selectedForEdit.set(null);\n queueMicrotask(() => this.selectedForEdit.set(message));\n } else {\n this.selectedForEdit.set(message);\n }\n\n return this;\n }\n\n onEditChange(id: number, isEdit: boolean): this {\n const message = this.messageList().find(item => item.id === id);\n if (!message) {\n return this;\n }\n\n if (isEdit) {\n return this.startEdit(message);\n }\n\n message.edit = false;\n\n if (this.selectedForEdit()?.id === id) {\n this.selectedForEdit.set(null);\n }\n\n return this;\n }\n\n onRequestEdit(message: ChatMessage | null): this {\n if (message) {\n return this.startEdit(message);\n }\n\n this.selectedForEdit.set(null);\n return this;\n }\n\n onRequestDelete(messageId: number | null): this {\n if (messageId == null) {\n return this;\n }\n\n this.selectedForEdit.set(null);\n this.requestDelete.set(messageId);\n queueMicrotask(() => this.requestDelete.set(null));\n\n return this;\n }\n\n trackByMessageId(index: number, message: ChatMessage): string {\n return `${message.chat_id}-${message.type}-${message.id}-${index}`;\n }\n\n protected readonly Math = Math;\n}\n","<div class=\"chat\">\n @if (messageList()) {\n <div #chatFlowRef\n class=\"chat__flow\"\n infiniteScroll\n [scrollWindow]=\"false\"\n [infiniteScrollUpDistance]=\"Math.max(historyLoadThreshold(), 2)\"\n [infiniteScrollThrottle]=\"100\"\n (scrolledUp)=\"onScrollUp()\"\n >\n @for (message of messageList(); track trackByMessageId(i, message); let i = $index) {\n @if (message | toggleDisplayChatStartDay: messageList() : i) {\n <span class=\"chat__start-day\">\n {{ message.cr_time | chatStartDay:'d MMMM' }}\n </span>\n }\n\n <div class=\"chat__message\" [attr.data-message-id]=\"message.id\">\n <lib-chat-message\n [currentMessage]=\"message\"\n [edit]=\"message.edit\"\n (editChange)=\"onEditChange(message.id, $event)\"\n (requestEditChange)=\"onRequestEdit($event)\"\n (requestDeleteChange)=\"onRequestDelete($event)\">\n </lib-chat-message>\n </div>\n }\n </div>\n\n @if (showScrollToBottom()) {\n <button class=\"chat__scroll-button\"\n type=\"button\"\n (click)=\"scrollToBottomSmooth()\"\n aria-label=\"Scroll to bottom\">\n <img ngSrc=\"assets/ngx-parl/icons/bottom-scroll.svg\"\n alt=\"\"\n width=\"14\"\n height=\"14\"/>\n </button>\n }\n } @else {\n <div class=\"chat__flow__empty\">\n <img ngSrc=\"assets/ngx-parl/icons/lucide_send.svg\"\n class=\"message__icon\"\n width=\"18\" height=\"24\" alt=\"hide\"/>\n\n\n <div class=\"chat__flow__empty--header\">\n <h3 class=\"chat__flow__empty--title\">{{ 'chat.chat_empty_title' | transloco }}</h3>\n <p class=\"chat__flow__empty--subscription\">{{ 'chat.chat_empty_subscription' | transloco }}</p>\n </div>\n </div>\n }\n</div>\n\n","export class ImageFile {\n constructor(\n public id: string,\n public url: string,\n public cr_time: string,\n ) {}\n}\n\nexport type OriginalKind = 'image' | 'gif';\n\nexport interface PreviewItem {\n originalKind: OriginalKind;\n duration?: number;\n src: string;\n name: string;\n type: string;\n size: number;\n}\n\nexport enum FileType {\n IMAGE = 'image',\n GIF = 'gif'\n}\n","import {\n AfterViewInit,\n Component,\n computed,\n effect,\n ElementRef,\n input,\n model,\n OnDestroy,\n signal,\n ViewChild\n} from '@angular/core';\nimport {FileType, OriginalKind, PreviewItem} from '../core/entity/file';\nimport {TranslocoPipe} from '@ngneat/transloco';\nimport {ChatMessage, CurrMessage, MessageActionEvent, MessageActionType} from '../core/entity/chat';\nimport {NgOptimizedImage} from '@angular/common';\n\n@Component({\n selector: 'app-input-message',\n imports: [TranslocoPipe, NgOptimizedImage],\n templateUrl: './input-message.html',\n styleUrl: './input-message.scss',\n standalone: true,\n})\n\nexport class InputMessageComponent implements AfterViewInit, OnDestroy {\n @ViewChild('inputText', {static: false}) inputTextElement!: ElementRef<HTMLDivElement>;\n @ViewChild('mirror', {static: false}) mirrorElement!: ElementRef<HTMLDivElement>;\n\n public editMessage = input<ChatMessage | { id: number; content: string; file_path?: string[] | null } | null>(null);\n\n public hasOriginalAttachments = computed(() => {\n const filePaths = this.editFilePaths();\n return filePaths.length > 0;\n });\n\n public hasNewAttachments = computed(() => (this.previews()?.length ?? 0) > 0);\n\n public cancelEdit = model<number | null>(null);\n public input_text = model<string | CurrMessage>('');\n\n public draft = signal<string>('');\n public focused = signal<boolean>(false);\n public sending = signal<boolean>(false);\n public hasText = computed(() => this.draft().trim().length > 0);\n public dragActive = signal<boolean>(false);\n\n public isEditMode = computed(() => !!this.editMessage());\n public canSend = computed(() =>\n this.hasText() ||\n this.hasNewAttachments() ||\n (this.isEditMode() && this.hasOriginalAttachments())\n );\n\n public files = model<File[]>([]);\n public previews = model<PreviewItem[]>([]);\n\n private lastHeightPx = 0;\n private lastRows = 1;\n private resizeRaf: number | null = null;\n private dragDepth = 0;\n\n public messageEvent = model<MessageActionEvent | null>(null);\n\n constructor() {\n effect(() => {\n const message = this.editMessage();\n const element = this.inputTextElement?.nativeElement;\n\n if (!element) {\n return;\n }\n\n if (message) {\n const content = (message as any).content ?? '';\n this.draft.set(content);\n element.innerText = content;\n\n queueMicrotask(() => {\n this.autoResizeByRows();\n element.focus();\n this.focused.set(true);\n this.setCaretToEnd(element);\n });\n }\n });\n }\n\n ngAfterViewInit() {\n const element = this.inputTextElement.nativeElement;\n element.style.transition = 'height 160ms ease';\n this.initMirror();\n\n const computedStyle = getComputedStyle(element);\n const lineHeight = this.cssNum(computedStyle.lineHeight, 24);\n\n element.style.height = `${lineHeight}px`;\n this.lastHeightPx = lineHeight;\n this.lastRows = 1;\n this.updateOverflow(1);\n\n requestAnimationFrame(() => {\n const {rows, nextHeightPx} = this.measureByMirror();\n element.style.height = `${nextHeightPx}px`;\n\n this.lastRows = rows;\n this.lastHeightPx = nextHeightPx;\n this.updateOverflow(rows);\n\n this.focusInput();\n });\n }\n\n ngOnDestroy() {\n if (this.resizeRaf) {\n cancelAnimationFrame(this.resizeRaf);\n this.resizeRaf = null;\n }\n }\n\n editFilePaths(): string[] {\n const message = this.editMessage();\n if (!message) {\n return [];\n }\n\n const file_path = (message as any).file_path;\n\n return Array.isArray(file_path) ? file_path : [];\n }\n\n collectAttachmentSources(): string[] {\n const newAttachments = (this.previews() ?? []).map(p => p.src).filter(Boolean);\n if (!this.isEditMode()) {\n return newAttachments;\n }\n\n const originalAttachments = this.editFilePaths().filter(Boolean);\n return Array.from(new Set([...originalAttachments, ...newAttachments]));\n }\n\n cancelEditMessage() {\n const message = this.editMessage();\n this.cancelEdit.set((message as any)?.id ?? null);\n queueMicrotask(() => this.cancelEdit.set(null));\n\n this.draft.set('');\n const element = this.inputTextElement?.nativeElement;\n\n if (element) {\n element.innerHTML = '';\n this.autoResizeByRows();\n element.focus();\n }\n\n return this;\n }\n\n focusInput() {\n const element = this.inputTextElement?.nativeElement;\n if (!element) {\n return this;\n }\n queueMicrotask(() => {\n element.focus();\n this.focused.set(true);\n });\n\n return this;\n }\n\n private setCaretToEnd(element: HTMLElement): void {\n const range = document.createRange();\n const selection = window.getSelection();\n if (!selection) return;\n\n range.selectNodeContents(element);\n range.collapse(false);\n selection.removeAllRanges();\n selection.addRange(range);\n }\n\n enterDown() {\n const element = this.inputTextElement.nativeElement;\n const text = this.draft().trim();\n\n if (!this.canSend()) {\n return this;\n }\n\n this.sending.set(true);\n\n const files = this.collectAttachmentSources();\n const fileList = this.files();\n\n const message = this.editMessage();\n const action: MessageActionType = message ? 'edit' : 'send';\n\n this.messageEvent.set({\n action,\n chatMessageId: message ? message.id : undefined,\n content: text,\n file_path: files.length ? files : [],\n file_list: fileList.length ? fileList : [],\n });\n\n queueMicrotask(() => this.messageEvent.set(null));\n\n const payload: CurrMessage = message ? {\n id: message.id,\n content: text,\n file_path: files.length ? files : [],\n file_list: fileList.length ? fileList : [],\n } : {\n content: text,\n file_path: files.length ? files : [],\n file_list: fileList.length ? fileList : [],\n };\n\n this.input_text.set(payload);\n\n this.draft.set('');\n element.innerHTML = '';\n this.files.set([]);\n this.previews.set([]);\n element.focus();\n this.autoResizeByRows();\n\n setTimeout(() => this.sending.set(false), 150);\n\n return this;\n }\n\n onFocus() {\n if (this.inputTextElement.nativeElement.innerHTML === '<br>') {\n this.inputTextElement.nativeElement.innerHTML = '';\n }\n this.focused.set(true);\n\n return this;\n }\n\n onBlur() {\n this.focused.set(false);\n\n return this;\n }\n\n onKeyDown(event: KeyboardEvent) {\n if (event.key === 'Enter' && !event.shiftKey) {\n event.preventDefault();\n this.enterDown();\n\n return this;\n }\n queueMicrotask(() => this.autoResizeByRows());\n\n return this;\n }\n\n onInput() {\n this.draft.set(this.inputTextElement.nativeElement.innerText ?? '');\n this.autoResizeByRows();\n\n return this;\n }\n\n onPaste() {\n queueMicrotask(() => {\n this.draft.set(this.inputTextElement.nativeElement.innerText ?? '');\n this.autoResizeByRows();\n });\n\n return this;\n }\n\n inputFileChange(event: Event) {\n const inputEl = event.target as HTMLInputElement;\n const selected = inputEl.files;\n\n if (!selected?.length) {\n inputEl.value = '';\n\n return this;\n }\n this.addFiles(Array.from(selected));\n inputEl.value = '';\n\n return this;\n }\n\n onDragEnter(event: DragEvent) {\n event.preventDefault();\n event.stopPropagation();\n this.dragDepth += 1;\n this.dragActive.set(true);\n\n return this;\n }\n\n onDragOver(event: DragEvent) {\n event.preventDefault();\n event.stopPropagation();\n if (event.dataTransfer) {\n event.dataTransfer.dropEffect = 'copy';\n }\n this.dragActive.set(true);\n\n return this;\n }\n\n onDragLeave(event: DragEvent) {\n event.preventDefault();\n event.stopPropagation();\n this.dragDepth = Math.max(0, this.dragDepth - 1);\n if (this.dragDepth === 0) {\n this.dragActive.set(false);\n }\n\n return this;\n }\n\n onDrop(event: DragEvent) {\n event.preventDefault();\n event.stopPropagation();\n this.dragDepth = 0;\n this.dragActive.set(false);\n\n const files = event.dataTransfer?.files;\n if (!files?.length) {\n return this;\n }\n\n this.addFiles(Array.from(files));\n\n return this;\n }\n\n removeFile(index: number, event?: MouseEvent) {\n event?.stopPropagation();\n event?.preventDefault();\n\n const previews = [...(this.previews() ?? [])];\n previews.splice(index, 1);\n this.previews.set(previews);\n\n const filesArr = [...(this.files() ?? [])];\n if (index >= 0 && index < filesArr.length) {\n filesArr.splice(index, 1);\n this.files.set(filesArr);\n }\n return this;\n }\n\n openPreview(_item: PreviewItem, _index: number) {\n return this;\n }\n\n autoResizeByRows() {\n const element = this.inputTextElement.nativeElement;\n const {rows, nextHeightPx} = this.measureByMirror();\n\n if (rows === this.lastRows) {\n this.updateOverflow(rows);\n\n return this;\n }\n\n if (this.resizeRaf) {\n cancelAnimationFrame(this.resizeRaf);\n }\n\n element.style.height = `${this.lastHeightPx}px`;\n\n this.resizeRaf = requestAnimationFrame(() => {\n element.style.height = `${nextHeightPx}px`;\n this.lastHeightPx = nextHeightPx;\n this.lastRows = rows;\n this.updateOverflow(rows);\n });\n\n return this;\n }\n\n measureByMirror(): { rows: number; nextHeightPx: number } {\n const inputEl = this.inputTextElement.nativeElement;\n const mirrorEl = this.mirrorElement.nativeElement;\n const computedStyle = getComputedStyle(inputEl);\n\n let text = inputEl.innerText;\n if (!text || text === '\\n') {\n text = '\\u00A0';\n }\n\n mirrorEl.style.width = computedStyle.width;\n mirrorEl.textContent = text;\n\n const lineHeight = this.cssNum(computedStyle.lineHeight, 24);\n const paddingTop = this.cssNum(computedStyle.paddingTop, 0);\n const paddingBottom = this.cssNum(computedStyle.paddingBottom, 0);\n const paddingY = paddingTop + paddingBottom;\n\n const maxRowsCss = computedStyle.getPropertyValue('--max-rows').trim();\n const maxRows = maxRowsCss ? this.cssNum(maxRowsCss, 8) : 8;\n\n const contentH = mirrorEl.offsetHeight;\n const rawRows = Math.max(1, Math.ceil(contentH / lineHeight));\n const rows = Math.min(rawRows, maxRows);\n\n const nextHeightPx = Math.round(rows * lineHeight + paddingY);\n\n return {rows, nextHeightPx};\n }\n\n initMirror() {\n const mirror = this.mirrorElement.nativeElement;\n const input = this.inputTextElement.nativeElement;\n const computedStyle = getComputedStyle(input);\n\n mirror.style.position = 'absolute';\n mirror.style.visibility = 'hidden';\n mirror.style.pointerEvents = 'none';\n mirror.style.zIndex = '-1';\n mirror.style.whiteSpace = 'pre-wrap';\n mirror.style.overflowWrap = 'break-word';\n mirror.style.wordBreak = 'normal';\n\n const properties = [\n 'font', 'font-size', 'font-family', 'font-weight', 'font-style',\n 'line-height', 'letter-spacing', 'word-spacing',\n 'padding-top', 'padding-bottom', 'padding-left', 'padding-right',\n 'border-top-width', 'border-bottom-width', 'border-left-width', 'border-right-width',\n 'white-space', 'text-transform', 'box-sizing'\n ];\n\n properties.forEach(property => (mirror.style as any)[property] = computedStyle.getPropertyValue(property));\n mirror.style.paddingTop = '0px';\n mirror.style.paddingBottom = '0px';\n }\n\n updateOverflow(rows: number) {\n const element = this.inputTextElement.nativeElement;\n const computedStyle = getComputedStyle(element);\n const maxRowsCss = computedStyle.getPropertyValue('--max-rows').trim();\n const maxRows = maxRowsCss ? this.cssNum(maxRowsCss, 8) : 8;\n element.style.overflowY = rows >= maxRows ? 'auto' : 'hidden';\n\n return this;\n }\n\n readFileAsDataURL(file: File): Promise<string> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = e => resolve((e.target?.result as string) || '');\n reader.onerror = reject;\n reader.readAsDataURL(file);\n });\n }\n\n cssNum(v: string, fb = 0): number {\n const n = parseFloat(v);\n return Number.isFinite(n) ? n : fb;\n }\n\n public addFiles(files: File[]) {\n const list = files.filter(f => (f.type || '').startsWith('image/'));\n if (!list.length) {\n return this;\n }\n\n this.files.set([...(this.files() ?? []), ...list]);\n\n Promise.all(\n list.map(async f => {\n const src = await this.readFileAsDataURL(f);\n const originalKind: OriginalKind = (f.type || '') === 'image/gif' ? FileType.GIF : FileType.IMAGE;\n return <PreviewItem>{src, originalKind, name: f.name, type: f.type || '', size: f.size};\n })\n )\n .then(items => this.previews.set([...(this.previews() ?? []), ...items]));\n\n return this;\n }\n\n protected readonly FileType = FileType;\n}\n","<section class=\"message\"\n [class.message--focus]=\"focused()\"\n [class.message--filled]=\"hasText()\"\n [class.message--sending]=\"sending()\"\n [class.message--dragover]=\"dragActive()\"\n (dragenter)=\"onDragEnter($event)\"\n (dragover)=\"onDragOver($event)\"\n (dragleave)=\"onDragLeave($event)\"\n (drop)=\"onDrop($event)\">\n\n @if (isEditMode()) {\n <div class=\"message__wrap\">\n <div class=\"message__wrap--input\">\n <button class=\"message__button message__button--attach\">\n <img ngSrc=\"assets/ngx-parl/icons/icon-edit.svg\"\n class=\"message__icon message__icon--edit\"\n width=\"18\" height=\"18\" alt=\"hide\"/>\n </button>\n\n <div class=\"message__edit-hint\">\n <p>{{ editMessage()?.content }}</p>\n </div>\n </div>\n\n <button class=\"message__button message__button--close\"\n type=\"button\"\n (click)=\"cancelEditMessage()\">\n <img ngSrc=\"assets/ngx-parl/icons/close.svg\"\n class=\"message__icon message__icon--close\"\n width=\"18\" height=\"18\" alt=\"hide\"/>\n </button>\n </div>\n }\n\n <div class=\"message__wrap\">\n <div class=\"message__wrap--input\">\n <button type=\"button\"\n class=\"message__button message__button--attach\"\n [attr.aria-label]=\"'chat.attach' | transloco\"\n (click)=\"fileDialog.click()\">\n <img ngSrc=\"assets/ngx-parl/icons/attach-filled.svg\"\n class=\"message__icon message__icon--attach\"\n width=\"18\" height=\"18\" alt=\"hide\"/>\n </button>\n\n <input #fileDialog\n type=\"file\"\n class=\"hidden\"\n accept=\"image/*\"\n multiple\n (change)=\"inputFileChange($event)\">\n\n <div #inputText\n role=\"textbox\"\n class=\"message__input\"\n spellcheck=\"true\"\n contenteditable=\"true\"\n aria-multiline=\"true\"\n [attr.data-placeholder]=\"isEditMode()\n ? ('chat.edit_placeholder' | transloco)\n : ('chat.placeholder' | transloco)\"\n (blur)=\"onBlur()\"\n (focus)=\"onFocus()\"\n (input)=\"onInput()\"\n (paste)=\"onPaste()\"\n (keydown)=\"onKeyDown($event)\">\n </div>\n\n <div #mirror class=\"message__input-mirror\" aria-hidden=\"true\"></div>\n\n <ng-content></ng-content>\n </div>\n\n <button class=\"message__button message__button--send\"\n type=\"button\"\n (click)=\"enterDown()\"\n [attr.aria-label]=\"'chat.send' | transloco\"\n [disabled]=\"!canSend()\">\n <img ngSrc=\"assets/ngx-parl/icons/send.svg\"\n class=\"message__icon message__icon--send\"\n width=\"18\" height=\"18\" alt=\"hide\"/>\n\n </button>\n </div>\n\n @if (previews().length) {\n <div class=\"message__files\">\n @for (item of previews(); track $index) {\n <div class=\"message__file\" [attr.data-kind]=\"item.originalKind\">\n <button type=\"button\"\n class=\"message__file-remove\"\n [attr.aria-label]=\"'chat.delete_file' | transloco\"\n (click)=\"removeFile($index, $event)\">\n <img ngSrc=\"assets/ngx-parl/icons/remove.svg\"\n class=\"message__icon message__icon--file\"\n width=\"18\" height=\"18\" alt=\"hide\"/>\n </button>\n\n <div class=\"message__file-media\" (click)=\"openPreview(item, $index)\">\n <img [src]=\"item.src\" [alt]=\"item.name\" class=\"message__file-img\"/>\n\n @if (item.originalKind === FileType.GIF) {\n <span class=\"message__file-badge message__file-badge--gif\">\n {{ 'chat.gif' | transloco }}\n </span>\n }\n </div>\n </div>\n }\n </div>\n }\n</section>\n\n\n","export enum FlowTheme {\n PRIMARY = 'primary',\n SECONDARY = 'secondary',\n}\n","import {AfterViewInit, Component, computed, effect, input, model, OnDestroy, Optional, ViewChild} from '@angular/core';\nimport {NgClass, NgOptimizedImage} from '@angular/common';\nimport {ChatFlowComponent} from '../chat-flow/chat-flow';\nimport {MatDialogContent, MatDialogRef, MatDialogTitle} from '@angular/material/dialog';\nimport {\n ChatMessage,\n ChatMessageDTO,\n ChatMessageType,\n CurrMessage,\n MessageActionEvent,\n MessageType\n} from '../core/entity/chat';\nimport {MatProgressSpinner} from '@angular/material/progress-spinner';\nimport {InputMessageComponent} from '../input-message/input-message';\nimport {\n TranslocoModule,\n TranslocoPipe,\n TranslocoService,\n} from '@ngneat/transloco';\nimport {UtilsService} from '../core/service/utils/utils';\nimport {FlowTheme} from '../core/entity/theme';\nimport {Subscription} from 'rxjs';\n\n@Component({\n selector: 'ngx-parl',\n standalone: true,\n imports: [\n NgOptimizedImage, NgClass, MatDialogContent, MatDialogTitle, MatProgressSpinner, ChatFlowComponent, InputMessageComponent,\n TranslocoModule,\n TranslocoPipe\n ],\n templateUrl: './ngx-parl.html',\n styleUrl: './ngx-parl.scss',\n providers: [],\n})\nexport class NgxParlComponent implements AfterViewInit, OnDestroy {\n @ViewChild(ChatFlowComponent) chatFlow?: ChatFlowComponent;\n @ViewChild(InputMessageComponent) inputMessage?: InputMessageComponent;\n\n public ai_run_in_progress = false;\n public dragActive = model<boolean>(false);\n private dragDepth = 0;\n private lastUpdateKey: string | null = null;\n\n public theme = input<FlowTheme>(FlowTheme.PRIMARY);\n public header = input<boolean>(true);\n public language = input<'en' | 'uk'>('en');\n\n public messageList = model<ChatMessage[]>([]);\n public messageUpdate = model<ChatMessage>();\n public selectedForEdit = model<ChatMessage | null>(null);\n public messageAction = model<MessageActionEvent | null>(null);\n\n public incomingUser = input<string>('');\n public transportType = input<string>('');\n public transportTypeIcon = input<string>('');\n public transportTypeIconSrc = computed(() => this.utils.normalizeSourcePath(this.transportTypeIcon()));\n\n public hideHandler = input<(() => unknown) | null>(null);\n public closeHandler = input<(() => unknown) | null>(null);\n\n public scrollToBottomTrigger = model<number>(0);\n public loadHistory = model<boolean>(false);\n private focusTimers: number[] = [];\n private afterOpenedSubscription?: Subscription;\n\n constructor(private utils: UtilsService,\n private transloco: TranslocoService,\n @Optional() private dialogRef?: MatDialogRef<NgxParlComponent>) {\n effect(() => {\n this.transloco.setActiveLang(this.language());\n });\n\n effect(() => {\n const updatedMessage = this.messageUpdate();\n\n if (!updatedMessage) {\n return;\n }\n\n const key = `${updatedMessage.id}-${updatedMessage.cr_time}-${updatedMessage.type}`;\n if (this.lastUpdateKey === key) {\n return;\n }\n\n this.lastUpdateKey = key;\n\n this.messageList.update(list => {\n const index = list.findIndex(m => m.id === updatedMessage.id);\n\n if (index > -1) {\n const updated = [...list];\n updated[index] = updatedMessage;\n return updated;\n }\n\n return [...list, updatedMessage];\n });\n\n this.scrollToBottom();\n });\n }\n\n ngAfterViewInit() {\n if (this.dialogRef) {\n this.afterOpenedSubscription = this.dialogRef.afterOpened().subscribe(() => {\n this.queueInitialFocus();\n });\n } else {\n this.queueInitialFocus();\n }\n }\n\n ngOnDestroy() {\n this.focusTimers.forEach(timerId => clearTimeout(timerId));\n this.focusTimers = [];\n this.afterOpenedSubscription?.unsubscribe();\n }\n\n private queueInitialFocus() {\n const focusInputIfAppropriate = (allowStealingFocus: boolean) => {\n if (!this.inputMessage) {\n return;\n }\n if (!allowStealingFocus) {\n const activeElement = document.activeElement;\n if (activeElement && activeElement !== document.body) {\n return;\n }\n }\n\n this.inputMessage.focusInput();\n };\n\n const immediateTimerId = window.setTimeout(() => {\n focusInputIfAppropriate(true);\n }, 0);\n this.focusTimers.push(immediateTimerId);\n\n const delayedTimerId = window.setTimeout(() => {\n focusInputIfAppropriate(false);\n }, 200);\n\n this.focusTimers.push(delayedTimerId);\n }\n\n onCancelEdit(messageId: number | null) {\n if (messageId != null) {\n this.messageList.update(list => {\n const updated = [...list];\n const index = updated.findIndex(m => m.id === messageId);\n if (index > -1) {\n updated[index].edit = false;\n }\n return updated;\n });\n }\n\n this.selectedForEdit.set(null);\n\n return this;\n }\n\n onRequestDelete(messageId: number | null) {\n if (messageId == null) {\n return this;\n }\n\n const message = this.messageList().find(m => m.id === messageId);\n const content = (message as { content?: string })?.content ?? '';\n\n this.messageList.update(list => list.filter(m => m.id !== messageId));\n\n this.pushMessageAction({\n action: 'delete',\n chatMessageId: messageId,\n content,\n });\n\n return this;\n }\n\n sendMessage(\n event:\n | CurrMessage\n | string\n | undefined\n ) {\n if (!event) {\n return this;\n }\n\n // edit message\n if (this.isCurrMessage(event) && event.id !== undefined) {\n const {id, content, file_path, file_list, user_id, user, transport_type, transport_type_icon} = event;\n\n this.messageList.update((currentList) => {\n const updatedList = [...currentList];\n const index = updatedList.findIndex(\n (message) => message.id === id,\n );\n\n if (index > -1) {\n updatedList[index].content = (content ?? '').trim();\n\n updatedList[index].file_path =\n Array.isArray(file_path) && file_path.length ? file_path : null;\n updatedList[index].file_list =\n Array.isArray(file_list) && file_list.length ? file_list : null;\n if (transport_type !== undefined) {\n updatedList[index].transport_type = transport_type ?? null;\n }\n if (transport_type_icon !== undefined) {\n updatedList[index].transport_type_icon = transport_type_icon ?? null;\n }\n\n updatedList[index].edit = false;\n }\n\n return updatedList;\n });\n\n this.selectedForEdit.set(null);\n\n this.pushMessageAction({\n action: 'edit',\n chatMessageId: id,\n content: (content ?? '').trim(),\n file_path: Array.isArray(file_path) && file_path.length ? file_path : [],\n file_list: Array.isArray(file_list) && file_list.length ? file_list : [],\n user_id: user_id,\n user: user,\n transport_type: transport_type ?? null,\n transport_type_icon: transport_type_icon ?? null,\n });\n\n return this;\n }\n\n // new message\n if (this.isCurrMessage(event)) {\n const hasFiles = Array.isArray(event.file_path) && event.file_path.length > 0;\n\n if (!hasFiles) {\n const {content, user_id, user, transport_type, transport_type_icon} = event;\n\n const messages = this.messageList();\n const lastId = messages.at(-1)?.id ?? 0;\n\n const lastOutgoing = [...messages]\n .reverse()\n .find((message) => message.type === MessageType.Outgoing,);\n const fallbackTransport = lastOutgoing?.transport_type ?? this.transportType() ?? null;\n const fallbackTransportIcon = lastOutgoing?.transport_type_icon ?? this.transportTypeIcon() ?? null;\n\n const dto: ChatMessageDTO = {\n id: lastId + 1,\n chat_id: lastOutgoing?.chat_id ?? 1,\n cr_time: this.utils.getLocalISODate(),\n type: MessageType.Outgoing as ChatMessageType,\n transport_type: transport_type ?? fallbackTransport,\n transport_type_icon: transport_type_icon ?? fallbackTransportIcon,\n user: lastOutgoing?.user ?? '',\n content: content,\n avatar: lastOutgoing?.avatar ?? null,\n file_path: [],\n file_list: [],\n checked: true,\n pending: true,\n };\n\n this.messageList.update((list) => [...list, new ChatMessage(dto)]);\n this.scrollToBottomTrigger.update(v => v + 1);\n this.pushMessageAction({\n action: 'send',\n chatMessageId: dto.id,\n content: content,\n user_id: user_id,\n user: user,\n transport_type: dto.transport_type ?? null,\n transport_type_icon: dto.transport_type_icon ?? null,\n });\n\n return this;\n }\n }\n\n // new message + files\n if (!this.isCurrMessage(event)) {\n return this;\n }\n\n const {content, file_path, file_list, user_id, user, transport_type, transport_type_icon} = event;\n const text = (content ?? '').trim();\n const hasFiles = Array.isArray(file_path) && file_path.length > 0;\n const hasFileList = Array.isArray(file_list) && file_list.length > 0;\n\n if (!text && !hasFiles) {\n return this;\n }\n\n const messages = this.messageList();\n const lastId = messages.at(-1)?.id ?? 0;\n\n const lastOutgoing = [...messages]\n .reverse()\n .find((message) => message.type === MessageType.Outgoing,);\n const fallbackTransport = lastOutgoing?.transport_type ?? this.transportType() ?? null;\n const fallbackTransportIcon = lastOutgoing?.transport_type_icon ?? this.transportTypeIcon() ?? null;\n\n const dto: ChatMessageDTO = {\n id: lastId + 1,\n chat_id: lastOutgoing?.chat_id ?? 1,\n cr_time: this.utils.getLocalISODate(),\n type: MessageType.Outgoing as ChatMessageType,\n transport_type: transport_type ?? fallbackTransport,\n transport_type_icon: transport_type_icon ?? fallbackTransportIcon,\n user: lastOutgoing?.user ?? '',\n content: text,\n avatar: lastOutgoing?.avatar ?? null,\n file_path: hasFiles ? file_path : [],\n file_list: hasFileList ? file_list : [],\n checked: true,\n pending: true,\n };\n\n this.messageList.update((list) => [...list, new ChatMessage(dto)]);\n this.scrollToBottomTrigger.update(v => v + 1);\n this.pushMessageAction({\n action: 'send',\n chatMessageId: dto.id,\n content: text,\n file_path: hasFiles ? file_path : [],\n file_list: hasFileList ? file_list : [],\n user_id: user_id,\n user: user,\n transport_type: dto.transport_type ?? null,\n transport_type_icon: dto.transport_type_icon ?? null,\n });\n\n return this;\n }\n\n isCurrMessage(event: unknown): event is CurrMessage {\n return typeof event === 'object' && event !== null && 'content' in event;\n }\n\n pushMessageAction(event: MessageActionEvent) {\n this.messageAction.set(event);\n setTimeout(() => this.messageAction.set(null), 0);\n return this;\n }\n\n scrollToBottom(): this {\n this.chatFlow?.scrollToBottom();\n\n return this;\n }\n\n onHideClick() {\n const handler = this.hideHandler();\n\n if (handler) {\n handler();\n }\n return this;\n }\n\n onCloseClick() {\n const handler = this.closeHandler();\n\n if (handler) {\n handler();\n }\n\n return this;\n }\n\n onDragOver(event: DragEvent) {\n event.preventDefault();\n event.stopPropagation();\n if (event.dataTransfer) {\n event.dataTransfer.dropEffect = 'copy';\n }\n this.dragActive.set(true);\n\n return this;\n }\n\n onDragEnter(event: DragEvent) {\n event.preventDefault();\n event.stopPropagation();\n this.dragDepth += 1;\n this.dragActive.set(true);\n\n return this;\n }\n\n onDragLeave(event: DragEvent) {\n event.preventDefault();\n event.stopPropagation();\n this.dragDepth = Math.max(0, this.dragDepth - 1);\n if (this.dragDepth === 0) {\n this.dragActive.set(false);\n }\n\n return this;\n }\n\n onDrop(event: DragEvent) {\n event.preventDefault();\n event.stopPropagation();\n this.dragDepth = 0;\n this.dragActive.set(false);\n\n const files = event.dataTransfer?.files;\n if (!files?.length) {\n return this;\n }\n\n this.inputMessage?.addFiles(Array.from(files));\n\n return this;\n }\n\n protected readonly FlowTheme = FlowTheme;\n}\n","<div class=\"modal-chat\" [ngClass]=\"'flow-theme-' + theme()\">\n <div class=\"modal-chat__body\">\n @if (header()) {\n <header class=\"modal-chat__header\" mat-dialog-title>\n <div class=\"modal-chat__hide-block\"></div>\n\n <div class=\"modal-chat__title\">\n <h1 class=\"modal-chat__heading\" id=\"modal-chat__heading\">\n @if (transportTypeIconSrc()) {\n <img [ngSrc]=\"transportTypeIconSrc()\"\n class=\"modal-chat__heading-icon\"\n width=\"20\"\n height=\"20\"\n [attr.alt]=\"transportType() || 'transport icon'\"/>\n }\n <span class=\"modal-chat__heading-text\">\n {{ transportType() }} {{ incomingUser() }}\n </span>\n </h1>\n </div>\n\n <div class=\"modal-chat__actions\">\n <img ngSrc=\"assets/ngx-parl/icons/hide.svg\" class=\"modal-chat__icon modal-chat__icon--hide\"\n width=\"24\" height=\"24\" alt=\"hide\"\n (click)=\"onHideClick()\"/>\n <img ngSrc=\"assets/ngx-parl/icons/close.svg\" class=\"modal-chat__icon modal-chat__icon--close\"\n width=\"24\" height=\"24\" alt=\"close\"\n (click)=\"onCloseClick()\"/>\n </div>\n </header>\n }\n\n <mat-dialog-content class=\"modal-chat__content\"\n [class.modal-chat__content--header]=\"header() === false\"\n [class.modal-chat__content--dragover]=\"dragActive()\"\n (dragenter)=\"onDragEnter($event)\"\n (dragover)=\"onDragOver($event)\"\n (dragleave)=\"onDragLeave($event)\"\n (drop)=\"onDrop($event)\">\n @if (dragActive()) {\n <div class=\"modal-chat__drag-overlay\"\n role=\"status\"\n aria-live=\"polite\"\n [attr.aria-label]=\"'chat.drag_title' | transloco\">\n <div class=\"modal-chat__drag-card\">\n <img ngSrc=\"assets/ngx-parl/icons/attach-filled.svg\"\n class=\"modal-chat__drag-icon\"\n alt=\"\"\n width=\"56\"\n height=\"56\"/>\n\n <div class=\"modal-chat__drag-title\">\n {{ 'chat.drag_title' | transloco }}\n </div>\n <div class=\"modal-chat__drag-subtitle\">\n {{ 'chat.drag_subtitle' | transloco }}\n </div>\n </div>\n </div>\n }\n <app-chat-flow [messageListInput]=\"messageList()\"\n [(selectedForEdit)]=\"selectedForEdit\"\n (requestDeleteChange)=\"onRequestDelete($event)\"\n [(scrollToBottomTrigger)]=\"scrollToBottomTrigger\"\n [(loadHistory)]=\"loadHistory\">\n </app-chat-flow>\n\n <app-input-message [editMessage]=\"selectedForEdit()\"\n (cancelEditChange)=\"onCancelEdit($event)\"\n (input_textChange)=\"sendMessage($event)\">\n @if (ai_run_in_progress) {\n <mat-spinner [diameter]=\"30\"></mat-spinner>\n }\n </app-input-message>\n </mat-dialog-content>\n </div>\n</div>\n","import { Injectable } from '@angular/core';\nimport { TranslocoLoader, Translation } from '@ngneat/transloco';\nimport { Observable, of } from 'rxjs';\n\nimport en from '../../assets/i18n/en.json';\nimport uk from '../../assets/i18n/uk.json';\n\n@Injectable()\nexport class ParlTranslocoLoader implements TranslocoLoader {\n getTranslation(lang: string): Observable<Translation> {\n switch (lang) {\n case 'uk':\n return of(uk as Translation);\n case 'en':\n default:\n return of(en as Translation);\n }\n }\n}\n","import { isDevMode } from '@angular/core';\nimport { provideTransloco } from '@ngneat/transloco';\nimport { ParlTranslocoLoader } from '../assets/i18n/parl-transloco.loader';\n\nexport function provideNgxParl() {\n return provideTransloco({\n config: {\n availableLangs: ['en', 'uk'],\n defaultLang: 'en',\n reRenderOnLangChange: true,\n prodMode: !isDevMode(),\n },\n loader: ParlTranslocoLoader,\n });\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.UtilsService"],"mappings":"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"}
|
package/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as _angular_core from '@angular/core';
|
|
2
|
-
import { AfterViewInit,
|
|
2
|
+
import { AfterViewInit, OnDestroy, ElementRef } from '@angular/core';
|
|
3
3
|
import { MatDialogRef } from '@angular/material/dialog';
|
|
4
4
|
import { TranslocoService } from '@ngneat/transloco';
|
|
5
5
|
import { HttpClient } from '@angular/common/http';
|
|
@@ -18,6 +18,7 @@ declare class ChatMessage {
|
|
|
18
18
|
file_list: File[] | null;
|
|
19
19
|
checked: boolean | null;
|
|
20
20
|
edit: boolean;
|
|
21
|
+
pending: boolean;
|
|
21
22
|
constructor(data: ChatMessageDTO);
|
|
22
23
|
get dateSimple(): string;
|
|
23
24
|
get timeHHmm(): string;
|
|
@@ -35,6 +36,7 @@ interface ChatMessageDTO {
|
|
|
35
36
|
file_path?: string[] | [] | null;
|
|
36
37
|
file_list?: File[] | [] | null;
|
|
37
38
|
checked?: boolean | null;
|
|
39
|
+
pending?: boolean;
|
|
38
40
|
}
|
|
39
41
|
type ChatMessageType = 'incoming' | 'outgoing';
|
|
40
42
|
interface CurrMessage {
|
|
@@ -60,7 +62,7 @@ interface MessageActionEvent {
|
|
|
60
62
|
transport_type_icon?: string | null;
|
|
61
63
|
}
|
|
62
64
|
|
|
63
|
-
declare class ChatFlowComponent implements AfterViewInit {
|
|
65
|
+
declare class ChatFlowComponent implements AfterViewInit, OnDestroy {
|
|
64
66
|
flowRef?: ElementRef<HTMLElement>;
|
|
65
67
|
scrollToBottomTrigger: _angular_core.ModelSignal<number>;
|
|
66
68
|
loadHistory: _angular_core.ModelSignal<boolean>;
|
|
@@ -76,6 +78,7 @@ declare class ChatFlowComponent implements AfterViewInit {
|
|
|
76
78
|
private previousScrollHeight;
|
|
77
79
|
private previousScrollTop;
|
|
78
80
|
private isUserAtBottom;
|
|
81
|
+
private resizeObserver;
|
|
79
82
|
showScrollToBottom: _angular_core.WritableSignal<boolean>;
|
|
80
83
|
historyLoadThreshold: _angular_core.WritableSignal<number>;
|
|
81
84
|
constructor();
|
|
@@ -84,6 +87,8 @@ declare class ChatFlowComponent implements AfterViewInit {
|
|
|
84
87
|
restoreScrollAfterHistoryPrepend(): this;
|
|
85
88
|
scrollToBottomSmooth(): this;
|
|
86
89
|
scrollToBottom(): this;
|
|
90
|
+
private observeScrollContainerForEmptySpace;
|
|
91
|
+
ngOnDestroy(): void;
|
|
87
92
|
startEdit(message: ChatMessage): this;
|
|
88
93
|
onEditChange(id: number, isEdit: boolean): this;
|
|
89
94
|
onRequestEdit(message: ChatMessage | null): this;
|
|
@@ -141,6 +146,7 @@ declare class InputMessageComponent implements AfterViewInit, OnDestroy {
|
|
|
141
146
|
collectAttachmentSources(): string[];
|
|
142
147
|
cancelEditMessage(): this;
|
|
143
148
|
focusInput(): this;
|
|
149
|
+
private setCaretToEnd;
|
|
144
150
|
enterDown(): this;
|
|
145
151
|
onFocus(): this;
|
|
146
152
|
onBlur(): this;
|