{"version":3,"file":"ng-vagabond-lab-ng-dsv-ds-toast.mjs","sources":["../../../projects/ng-dsv/ds/toast/service/toast.service.ts","../../../projects/ng-dsv/ds/toast/component/toast.component.ts","../../../projects/ng-dsv/ds/toast/component/toast.component.html","../../../projects/ng-dsv/ds/toast/ng-vagabond-lab-ng-dsv-ds-toast.ts"],"sourcesContent":["import { Injectable, signal } from '@angular/core';\nimport { ToastDto } from '../dto/toast.dto';\n\nexport const MAX_TOASTS = 10;\nexport const DURATION_DEFAULT = 5000;\nexport const DURATION_TIMEOUT = 10;\n\n@Injectable({\n    providedIn: 'root',\n})\nexport class ToastService {\n    toastShows = signal<ToastDto[]>([]);\n    toasts = signal<ToastDto[]>([]);\n\n    showToast(toast: ToastDto) {\n        toast.uuid = crypto.randomUUID();\n        toast.open = true;\n        toast.type = toast.type ?? 'success';\n        toast.duration = toast.duration ?? DURATION_DEFAULT;\n        toast.remainingDuration = toast.duration;\n        toast.filled = toast.filled ?? false;\n        const find = this.toastShows().find((t) => t.text === toast.text);\n        !find && this.toasts.update((toasts) => [...toasts, toast]);\n    }\n\n    consumeToast(toast: ToastDto) {\n        this.toastShows.update((toasts) => [...toasts, toast]);\n        let duration = 0;\n        const interval = setInterval(() => {\n            duration += DURATION_TIMEOUT;\n            if (duration > toast.duration!) {\n                clearInterval(interval);\n                this.closeToast(toast.uuid!);\n            } else {\n                this.toastShows.update((toasts) =>\n                    toasts.map((oneToast) => {\n                        if (oneToast.uuid === toast.uuid) {\n                            oneToast.remainingDuration = toast.duration! - duration;\n                        }\n                        return oneToast;\n                    }),\n                );\n            }\n        }, DURATION_TIMEOUT);\n        this.removeToastFromQueue(toast.uuid!);\n    }\n\n    closeToast(uuid: string) {\n        this.toastShows.update((toasts) =>\n            toasts.map((oneToast) => {\n                if (oneToast.uuid === uuid) {\n                    oneToast.open = false;\n                }\n                return oneToast;\n            }),\n        );\n        setInterval(() => {\n            this.toastShows.update((toasts) => toasts.filter((t) => t.uuid !== uuid));\n        }, 500);\n    }\n\n    removeToastFromQueue(uuid: string) {\n        this.toasts.update((toasts) => toasts.filter((t) => t.uuid !== uuid));\n    }\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, effect, inject, input } from '@angular/core';\nimport { MAX_TOASTS, ToastService } from '../service/toast.service';\n\n@Component({\n    selector: 'dsv-toast',\n    imports: [CommonModule],\n    templateUrl: './toast.component.html',\n    styleUrls: ['./toast.component.scss'],\n})\nexport class DsvToastComponent {\n    protected readonly toastService = inject(ToastService);\n\n    max = input<number>(MAX_TOASTS);\n\n    constructor() {\n        effect(() => {\n            for (const toast of this.toastService.toasts()) {\n                if (this.toastService.toastShows().length < this.max()) {\n                    this.toastService.consumeToast(toast);\n                }\n            }\n        });\n    }\n}\n","<div class=\"dsv-toast-container\">\n    @for (toast of toastService.toastShows(); track toast.uuid) {\n        <div\n            class=\"dsv-toast\"\n            [class.open]=\"toast.open\"\n            [class.close]=\"!toast.open\"\n            [ngClass]=\"toast.type + ' ' + (toast.filled ? 'filled' : '')\"\n        >\n            <button\n                class=\"close-button\"\n                type=\"button\"\n                (click)=\"toastService.closeToast(toast.uuid!)\"\n            >\n                X\n            </button>\n            @if (toast.type === 'success') {\n                <i class=\"ri-check-fill\"></i>\n            } @else if (toast.type === 'info') {\n                <i class=\"ri-information-2-line\"></i>\n            } @else if (toast.type === 'warning') {\n                <i class=\"ri-alert-line\"></i>\n            } @else if (toast.type === 'error') {\n                <i class=\"ri-close-line\"></i>\n            }\n\n            {{ toast.text }}\n            <div class=\"loader-container\">\n                <div\n                    class=\"loader\"\n                    [style.width]=\"(toast.remainingDuration! / toast.duration!) * 100 + '%'\"\n                ></div>\n            </div>\n        </div>\n    }\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}