{"version":3,"file":"seniorsistemas-angular-components-chat.mjs","sources":["../../projects/angular-components/chat/src/lib/chat/components/chat-message/chat-message.component.ts","../../projects/angular-components/chat/src/lib/chat/components/chat-message/chat-message.component.html","../../projects/angular-components/chat/src/lib/chat/chat.component.ts","../../projects/angular-components/chat/src/lib/chat/chat.component.html","../../projects/angular-components/chat/src/lib/chat/chat.module.ts","../../projects/angular-components/chat/src/seniorsistemas-angular-components-chat.ts"],"sourcesContent":["import { Component, Input, OnChanges, SimpleChanges } from '@angular/core';\r\n\r\nimport { ChatMessage } from '../../types/chat-message';\r\nimport { AsyncPipe, NgClass } from '@angular/common';\r\nimport { LocalizedDatePipe } from '@seniorsistemas/angular-components/locale';\r\nimport { TranslatePipe } from '@ngx-translate/core';\r\n\r\n/**\r\n * @description Componente que renderiza uma única mensagem de chat.\r\n * Exibe o conteúdo textual, o remetente (próprio ou terceiro) e suporte a\r\n * anexos via `attachmentUrl`, exibindo o nome do arquivo automaticamente.\r\n *\r\n * @example\r\n * ```html\r\n * <s-chat-message [message]=\"item\" />\r\n * ```\r\n *\r\n * @category Inputs\r\n */\r\n@Component({\r\n    selector: 's-chat-message',\r\n    templateUrl: './chat-message.component.html',\r\n    standalone: true,\r\n    imports: [AsyncPipe, NgClass, LocalizedDatePipe, TranslatePipe],\r\n})\r\nexport class ChatMessageComponent implements OnChanges {\r\n    /**\r\n     * @description Objeto com os dados da mensagem a ser exibida,\r\n     * incluindo texto, remetente e URL de anexo. Campo obrigatório.\r\n     */\r\n    @Input({ required: true })\r\n    public message!: ChatMessage;\r\n\r\n    public fileName: string | null = null;\r\n\r\n    public ngOnChanges(changes: SimpleChanges): void {\r\n        if (changes['message']) {\r\n            this.fileName = this.message.attachmentUrl ? this.getFileNameByUrl(this.message.attachmentUrl) : null;\r\n        }\r\n    }\r\n\r\n    private getFileNameByUrl(path: string): string | null {\r\n        const regex = /[^\\\\/]+$/;\r\n        const match = regex.exec(path);\r\n        return match ? match[0] : null;\r\n    }\r\n}\r\n","<div\r\n    class=\"flex py-[10px] px-5\"\r\n    [class.justify-end]=\"message.isMine\"\r\n>\r\n    <div\r\n        class=\"inline-flex flex-col max-w-[85%] p-5\"\r\n        [ngClass]=\"message.isMine\r\n            ? 'bg-grayscale-10 rounded-tl-[16px] rounded-tr-[16px] rounded-br-none rounded-bl-[16px]'\r\n            : 'bg-clairvoyant-100 rounded-tl-[16px] rounded-tr-[16px] rounded-br-[16px] rounded-bl-none'\"\r\n    >\r\n        <div class=\"flex items-center text-grayscale-100 font-open-sans gap-2\">\r\n            <img\r\n                class=\"rounded-[50%] overflow-hidden h-8 w-8 object-cover object-center bg-grayscale-0\"\r\n                [src]=\"message.thumbnailUrl\"\r\n                alt=\"Thumbnail\"\r\n            />\r\n            <span class=\"text-sm font-bold\">{{ message.senderName }}</span>\r\n            @if (message.sentAt) {\r\n                <span class=\"text-xs\">{{ message.sentAt | localizedDate: 'L LTS' | async }}</span>\r\n            }\r\n        </div>\r\n        <p class=\"text-grayscale-100 font-open-sans text-xs\">{{ message.text }}</p>\r\n\r\n        @if (message.attachmentUrl) {\r\n            <div class=\"flex items-center gap-[10px] mt-3 select-none flex-wrap\">\r\n                <span class=\"text-grayscale-100 font-open-sans text-xs font-bold\">{{ 'platform.angular_components.attachment' | translate }}:</span>\r\n                <a\r\n                    class=\"bg-grayscale-0 rounded-medium px-3 no-underline\"\r\n                    [href]=\"message.attachmentUrl\"\r\n                    [download]=\"fileName\"\r\n                    >{{ fileName }}</a\r\n                >\r\n            </div>\r\n        }\r\n    </div>\r\n</div>\r\n","import { AfterViewInit, Component, DestroyRef, ElementRef, Input, QueryList, ViewChildren, inject } from '@angular/core';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\n\r\nimport { ChatMessage } from './types/chat-message';\r\n\r\nimport { ChatMessageComponent as ChatMessageComponent_1 } from './components/chat-message/chat-message.component';\r\n\r\n/**\r\n * @description Componente de interface de chat que exibe uma lista de mensagens\r\n * e faz scroll automático até a última mensagem sempre que novas são adicionadas.\r\n * Renderiza cada mensagem via {@link ChatMessageComponent}.\r\n *\r\n * @example\r\n * ```html\r\n * <s-chat [messages]=\"conversaMensagens\" />\r\n * ```\r\n *\r\n * @category Inputs\r\n */\r\n@Component({\r\n    selector: 's-chat',\r\n    templateUrl: './chat.component.html',\r\n    standalone: true,\r\n    imports: [ChatMessageComponent_1],\r\n})\r\nexport class ChatComponent implements AfterViewInit {\r\n    private readonly _destroyRef = inject(DestroyRef);\r\n\r\n    /**\r\n     * @description Lista de mensagens exibidas no chat.\r\n     * Cada item é do tipo {@link ChatMessage}, contendo texto, remetente e demais metadados.\r\n     *\r\n     * @default []\r\n     */\r\n    @Input()\r\n    public messages: ChatMessage[] = [];\r\n\r\n    @ViewChildren('messageElements', { read: ElementRef })\r\n    private readonly messageElements: null | QueryList<ElementRef<HTMLElement>> = null;\r\n\r\n    public ngAfterViewInit(): void {\r\n        this.scrollToBottom();\r\n\r\n        this.messageElements?.changes.pipe(takeUntilDestroyed(this._destroyRef)).subscribe(() => {\r\n            this.scrollToBottom();\r\n        });\r\n    }\r\n\r\n    private scrollToBottom(): void {\r\n        this.messageElements?.last?.nativeElement.scrollIntoView({ behavior: 'smooth' });\r\n    }\r\n}\r\n","<div class=\"min-h-[500px] overflow-auto\">\r\n    @for (message of messages; track message) {\r\n        <s-chat-message\r\n            #messageElements\r\n            [message]=\"message\"\r\n        >\r\n        </s-chat-message>\r\n    }\r\n</div>\r\n","import { NgModule } from '@angular/core';\r\n\r\nimport { TranslateModule } from '@ngx-translate/core';\r\n\r\nimport { ChatComponent } from './chat.component';\r\n\r\n@NgModule({\r\n    imports: [TranslateModule.forChild(), ChatComponent],\r\n    exports: [ChatComponent],\r\n})\r\nexport class ChatModule {}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["ChatMessageComponent_1"],"mappings":"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"}