UNPKG

@hsaadawy/ngx-chat

Version:
62 lines 9.32 kB
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=