@hsaadawy/ngx-chat
Version:
62 lines • 9.32 kB
JavaScript
import { ComponentFactoryResolver, Directive, Input, ViewContainerRef } from '@angular/core';
import { ChatMessageLinkComponent } from '../components/chat-message-link/chat-message-link.component';
import { ChatMessageTextComponent } from '../components/chat-message-text/chat-message-text.component';
import { extractUrls } from '../core/utils-links';
export class LinksDirective {
constructor(resolver, viewContainerRef) {
this.resolver = resolver;
this.viewContainerRef = viewContainerRef;
}
ngOnChanges() {
this.transform();
}
transform() {
const message = this.ngxChatLinks;
if (!message) {
return;
}
const links = extractUrls(message);
const chatMessageTextFactory = this.resolver.resolveComponentFactory(ChatMessageTextComponent);
const chatMessageLinkFactory = this.resolver.resolveComponentFactory(ChatMessageLinkComponent);
let lastIndex = 0;
for (const link of links) {
const currentIndex = message.indexOf(link, lastIndex);
const textBeforeLink = message.substring(lastIndex, currentIndex);
if (textBeforeLink) {
const textBeforeLinkComponent = this.viewContainerRef.createComponent(chatMessageTextFactory);
textBeforeLinkComponent.instance.text = textBeforeLink;
}
const linkRef = this.viewContainerRef.createComponent(chatMessageLinkFactory);
linkRef.instance.link = link;
linkRef.instance.text = this.shorten(link);
lastIndex = currentIndex + link.length;
}
const textAfterLastLink = message.substring(lastIndex);
if (textAfterLastLink) {
const textAfterLastLinkComponent = this.viewContainerRef.createComponent(chatMessageTextFactory);
textAfterLastLinkComponent.instance.text = textAfterLastLink;
}
}
shorten(url) {
const parser = document.createElement('a');
parser.href = url;
let shortenedPathname = parser.pathname;
if (shortenedPathname.length > 17) {
shortenedPathname = shortenedPathname.substring(0, 5) + '...' + shortenedPathname.substring(shortenedPathname.length - 10);
}
return parser.protocol + '//' + parser.host + shortenedPathname;
}
}
LinksDirective.decorators = [
{ type: Directive, args: [{
selector: '[ngxChatLinks]'
},] }
];
LinksDirective.ctorParameters = () => [
{ type: ComponentFactoryResolver },
{ type: ViewContainerRef }
];
LinksDirective.propDecorators = {
ngxChatLinks: [{ type: Input }]
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlua3MuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcGF6em5ldHdvcmsvbmd4LWNoYXQvc3JjL2xpYi9kaXJlY3RpdmVzL2xpbmtzLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBYSxnQkFBZ0IsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN4RyxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSw2REFBNkQsQ0FBQztBQUN2RyxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSw2REFBNkQsQ0FBQztBQUN2RyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFLbEQsTUFBTSxPQUFPLGNBQWM7SUFJdkIsWUFBNkIsUUFBa0MsRUFDbEMsZ0JBQWtDO1FBRGxDLGFBQVEsR0FBUixRQUFRLENBQTBCO1FBQ2xDLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7SUFDL0QsQ0FBQztJQUVELFdBQVc7UUFDUCxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDckIsQ0FBQztJQUVPLFNBQVM7UUFDYixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDO1FBRWxDLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDVixPQUFPO1NBQ1Y7UUFFRCxNQUFNLEtBQUssR0FBRyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFbkMsTUFBTSxzQkFBc0IsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLHVCQUF1QixDQUFDLHdCQUF3QixDQUFDLENBQUM7UUFDL0YsTUFBTSxzQkFBc0IsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLHVCQUF1QixDQUFDLHdCQUF3QixDQUFDLENBQUM7UUFFL0YsSUFBSSxTQUFTLEdBQUcsQ0FBQyxDQUFDO1FBQ2xCLEtBQUssTUFBTSxJQUFJLElBQUksS0FBSyxFQUFFO1lBQ3RCLE1BQU0sWUFBWSxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBRXRELE1BQU0sY0FBYyxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUMsU0FBUyxFQUFFLFlBQVksQ0FBQyxDQUFDO1lBQ2xFLElBQUksY0FBYyxFQUFFO2dCQUNoQixNQUFNLHVCQUF1QixHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxlQUFlLENBQUMsc0JBQXNCLENBQUMsQ0FBQztnQkFDOUYsdUJBQXVCLENBQUMsUUFBUSxDQUFDLElBQUksR0FBRyxjQUFjLENBQUM7YUFDMUQ7WUFFRCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsZUFBZSxDQUFDLHNCQUFzQixDQUFDLENBQUM7WUFDOUUsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1lBQzdCLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7WUFFM0MsU0FBUyxHQUFHLFlBQVksR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1NBQzFDO1FBRUQsTUFBTSxpQkFBaUIsR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3ZELElBQUksaUJBQWlCLEVBQUU7WUFDbkIsTUFBTSwwQkFBMEIsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsZUFBZSxDQUFDLHNCQUFzQixDQUFDLENBQUM7WUFDakcsMEJBQTBCLENBQUMsUUFBUSxDQUFDLElBQUksR0FBRyxpQkFBaUIsQ0FBQztTQUNoRTtJQUNMLENBQUM7SUFFTyxPQUFPLENBQUMsR0FBVztRQUN2QixNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzNDLE1BQU0sQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDO1FBRWxCLElBQUksaUJBQWlCLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQztRQUN4QyxJQUFJLGlCQUFpQixDQUFDLE1BQU0sR0FBRyxFQUFFLEVBQUU7WUFDL0IsaUJBQWlCLEdBQUcsaUJBQWlCLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxLQUFLLEdBQUcsaUJBQWlCLENBQUMsU0FBUyxDQUFDLGlCQUFpQixDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUMsQ0FBQztTQUM5SDtRQUVELE9BQU8sTUFBTSxDQUFDLFFBQVEsR0FBRyxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksR0FBRyxpQkFBaUIsQ0FBQztJQUNwRSxDQUFDOzs7WUE3REosU0FBUyxTQUFDO2dCQUNQLFFBQVEsRUFBRSxnQkFBZ0I7YUFDN0I7OztZQVBRLHdCQUF3QjtZQUErQixnQkFBZ0I7OzsyQkFVM0UsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudEZhY3RvcnlSZXNvbHZlciwgRGlyZWN0aXZlLCBJbnB1dCwgT25DaGFuZ2VzLCBWaWV3Q29udGFpbmVyUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IENoYXRNZXNzYWdlTGlua0NvbXBvbmVudCB9IGZyb20gJy4uL2NvbXBvbmVudHMvY2hhdC1tZXNzYWdlLWxpbmsvY2hhdC1tZXNzYWdlLWxpbmsuY29tcG9uZW50JztcclxuaW1wb3J0IHsgQ2hhdE1lc3NhZ2VUZXh0Q29tcG9uZW50IH0gZnJvbSAnLi4vY29tcG9uZW50cy9jaGF0LW1lc3NhZ2UtdGV4dC9jaGF0LW1lc3NhZ2UtdGV4dC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBleHRyYWN0VXJscyB9IGZyb20gJy4uL2NvcmUvdXRpbHMtbGlua3MnO1xyXG5cclxuQERpcmVjdGl2ZSh7XHJcbiAgICBzZWxlY3RvcjogJ1tuZ3hDaGF0TGlua3NdJ1xyXG59KVxyXG5leHBvcnQgY2xhc3MgTGlua3NEaXJlY3RpdmUgaW1wbGVtZW50cyBPbkNoYW5nZXMge1xyXG5cclxuICAgIEBJbnB1dCgpIG5neENoYXRMaW5rczogc3RyaW5nO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgcmVzb2x2ZXI6IENvbXBvbmVudEZhY3RvcnlSZXNvbHZlcixcclxuICAgICAgICAgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgdmlld0NvbnRhaW5lclJlZjogVmlld0NvbnRhaW5lclJlZikge1xyXG4gICAgfVxyXG5cclxuICAgIG5nT25DaGFuZ2VzKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMudHJhbnNmb3JtKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSB0cmFuc2Zvcm0oKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IHRoaXMubmd4Q2hhdExpbmtzO1xyXG5cclxuICAgICAgICBpZiAoIW1lc3NhZ2UpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgbGlua3MgPSBleHRyYWN0VXJscyhtZXNzYWdlKTtcclxuXHJcbiAgICAgICAgY29uc3QgY2hhdE1lc3NhZ2VUZXh0RmFjdG9yeSA9IHRoaXMucmVzb2x2ZXIucmVzb2x2ZUNvbXBvbmVudEZhY3RvcnkoQ2hhdE1lc3NhZ2VUZXh0Q29tcG9uZW50KTtcclxuICAgICAgICBjb25zdCBjaGF0TWVzc2FnZUxpbmtGYWN0b3J5ID0gdGhpcy5yZXNvbHZlci5yZXNvbHZlQ29tcG9uZW50RmFjdG9yeShDaGF0TWVzc2FnZUxpbmtDb21wb25lbnQpO1xyXG5cclxuICAgICAgICBsZXQgbGFzdEluZGV4ID0gMDtcclxuICAgICAgICBmb3IgKGNvbnN0IGxpbmsgb2YgbGlua3MpIHtcclxuICAgICAgICAgICAgY29uc3QgY3VycmVudEluZGV4ID0gbWVzc2FnZS5pbmRleE9mKGxpbmssIGxhc3RJbmRleCk7XHJcblxyXG4gICAgICAgICAgICBjb25zdCB0ZXh0QmVmb3JlTGluayA9IG1lc3NhZ2Uuc3Vic3RyaW5nKGxhc3RJbmRleCwgY3VycmVudEluZGV4KTtcclxuICAgICAgICAgICAgaWYgKHRleHRCZWZvcmVMaW5rKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB0ZXh0QmVmb3JlTGlua0NvbXBvbmVudCA9IHRoaXMudmlld0NvbnRhaW5lclJlZi5jcmVhdGVDb21wb25lbnQoY2hhdE1lc3NhZ2VUZXh0RmFjdG9yeSk7XHJcbiAgICAgICAgICAgICAgICB0ZXh0QmVmb3JlTGlua0NvbXBvbmVudC5pbnN0YW5jZS50ZXh0ID0gdGV4dEJlZm9yZUxpbms7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGxpbmtSZWYgPSB0aGlzLnZpZXdDb250YWluZXJSZWYuY3JlYXRlQ29tcG9uZW50KGNoYXRNZXNzYWdlTGlua0ZhY3RvcnkpO1xyXG4gICAgICAgICAgICBsaW5rUmVmLmluc3RhbmNlLmxpbmsgPSBsaW5rO1xyXG4gICAgICAgICAgICBsaW5rUmVmLmluc3RhbmNlLnRleHQgPSB0aGlzLnNob3J0ZW4obGluayk7XHJcblxyXG4gICAgICAgICAgICBsYXN0SW5kZXggPSBjdXJyZW50SW5kZXggKyBsaW5rLmxlbmd0aDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IHRleHRBZnRlckxhc3RMaW5rID0gbWVzc2FnZS5zdWJzdHJpbmcobGFzdEluZGV4KTtcclxuICAgICAgICBpZiAodGV4dEFmdGVyTGFzdExpbmspIHtcclxuICAgICAgICAgICAgY29uc3QgdGV4dEFmdGVyTGFzdExpbmtDb21wb25lbnQgPSB0aGlzLnZpZXdDb250YWluZXJSZWYuY3JlYXRlQ29tcG9uZW50KGNoYXRNZXNzYWdlVGV4dEZhY3RvcnkpO1xyXG4gICAgICAgICAgICB0ZXh0QWZ0ZXJMYXN0TGlua0NvbXBvbmVudC5pbnN0YW5jZS50ZXh0ID0gdGV4dEFmdGVyTGFzdExpbms7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc2hvcnRlbih1cmw6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICAgICAgY29uc3QgcGFyc2VyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xyXG4gICAgICAgIHBhcnNlci5ocmVmID0gdXJsO1xyXG5cclxuICAgICAgICBsZXQgc2hvcnRlbmVkUGF0aG5hbWUgPSBwYXJzZXIucGF0aG5hbWU7XHJcbiAgICAgICAgaWYgKHNob3J0ZW5lZFBhdGhuYW1lLmxlbmd0aCA+IDE3KSB7XHJcbiAgICAgICAgICAgIHNob3J0ZW5lZFBhdGhuYW1lID0gc2hvcnRlbmVkUGF0aG5hbWUuc3Vic3RyaW5nKDAsIDUpICsgJy4uLicgKyBzaG9ydGVuZWRQYXRobmFtZS5zdWJzdHJpbmcoc2hvcnRlbmVkUGF0aG5hbWUubGVuZ3RoIC0gMTApO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHBhcnNlci5wcm90b2NvbCArICcvLycgKyBwYXJzZXIuaG9zdCArIHNob3J0ZW5lZFBhdGhuYW1lO1xyXG4gICAgfVxyXG5cclxufVxyXG4iXX0=