ng-toast-notify
Version:
Lightweight and flexible toast notifications for Angular
1 lines • 29 kB
Source Map (JSON)
{"version":3,"file":"ng-toast-notify.mjs","sources":["../../../projects/ng-toast-notify/src/lib/toastysound.service.ts","../../../projects/ng-toast-notify/src/lib/toasty.service.ts","../../../projects/ng-toast-notify/src/lib/toasty/toasty.component.ts","../../../projects/ng-toast-notify/src/lib/toasty/toasty.component.html","../../../projects/ng-toast-notify/src/public-api.ts","../../../projects/ng-toast-notify/src/ng-toast-notify.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class ToastysoundService {\r\n\r\n constructor() { }\r\n\r\n private oscillatorType: OscillatorType = 'sine';\r\n private frequency: number = 430;\r\n private audioCtx: AudioContext = new AudioContext();\r\n\r\n notify() {\r\n if (this.audioCtx.state === 'suspended') {\r\n this.audioCtx.resume();\r\n }\r\n \r\n const osc = this.audioCtx.createOscillator();\r\n const gain = this.audioCtx.createGain();\r\n\r\n osc.type = this.oscillatorType;\r\n osc.frequency.value = this.frequency;\r\n\r\n gain.gain.setValueAtTime(0.3, this.audioCtx.currentTime);\r\n gain.gain.exponentialRampToValueAtTime(0.00009, this.audioCtx.currentTime + 0.4);\r\n\r\n osc.connect(gain);\r\n gain.connect(this.audioCtx.destination);\r\n\r\n osc.start(0);\r\n osc.stop(this.audioCtx.currentTime + 1);\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { BehaviorSubject } from 'rxjs/internal/BehaviorSubject';\r\nimport { ToastysoundService } from './toastysound.service';\r\n\r\ninterface IServiceConfig {\r\n capacity: number;\r\n duration: number;\r\n messages: Record<string, string>;\r\n threshold_offsetX: number;\r\n}\r\n\r\ninterface IToastQueue<T> {\r\n setCapacity(c: number): void;\r\n getCapacity(): number;\r\n enqueue(item: T): void;\r\n dequeue(): T | undefined;\r\n size(): number;\r\n getElements(): T[];\r\n removeId(id: number): T | undefined;\r\n}\r\n\r\nclass Queue<T> implements IToastQueue<T> {\r\n private storage: T[] = [];\r\n\r\n constructor(private capacity: number = Infinity) {\r\n }\r\n\r\n setCapacity(c: number) {\r\n this.capacity = c;\r\n }\r\n getCapacity() { return this.capacity; }\r\n\r\n enqueue(item: T): void {\r\n if (this.size() >= this.capacity) {\r\n throw Error('Toasty queue has reached max capacity, you cannot add more items.');\r\n }\r\n this.storage.push(item);\r\n }\r\n dequeue(): T | undefined {\r\n return this.storage.shift();\r\n }\r\n size(): number {\r\n return this.storage.length;\r\n }\r\n getElements(): T[] {\r\n return this.storage;\r\n }\r\n removeId(id: number): T | undefined {\r\n const index = this.storage.findIndex(item => (item as any).id === id);\r\n if (index !== -1) {\r\n const [removed] = this.storage.splice(index, 1);\r\n return removed;\r\n }\r\n return undefined;\r\n }\r\n}\r\nexport enum ToastType {\r\n Basic = 'basic',\r\n Success = 'success',\r\n Error = 'error',\r\n Info = 'info',\r\n Warning = 'warning',\r\n Custom = 'custom'\r\n}\r\n\r\ninterface ToastGesture {\r\n date: number;\r\n touchStart?: Touch;\r\n touchEnd?: Touch;\r\n offsetX?: number;\r\n}\r\n\r\nexport interface ToastModel {\r\n id: number;\r\n title: string;\r\n message: string;\r\n type: ToastType;\r\n timestamp: number;\r\n duration: number;\r\n expires: number;\r\n config?: ToastyConfig;\r\n get icon(): string;\r\n\r\n gesture?: ToastGesture;\r\n animatePbar?: boolean; // Used to animate the progress bar\r\n}\r\n\r\nexport interface ToastyConfig {\r\n type?: ToastType;\r\n duration?: number;\r\n sticky?: boolean;\r\n enableHtml?: boolean;\r\n customStyle?: Record<string, string>;\r\n loading?: boolean;\r\n beep?: boolean;\r\n progressBar?: boolean;\r\n}\r\n\r\nexport interface ToastyPromise<T> {\r\n promise: Promise<T>;\r\n loading: string;\r\n success: string | ((result: T) => string);\r\n error: string | ((err: any) => string);\r\n}\r\n\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class ToastyService {\r\n\r\n private TOASTY_SERVICE_CONFIG: IServiceConfig = {\r\n capacity: 10,\r\n duration: 5000,\r\n messages: {\r\n now: 'just now',\r\n seconds: '{0} seconds ago',\r\n minutes: '{0} minutes ago'\r\n },\r\n threshold_offsetX: 170\r\n };\r\n\r\n\r\n private queue: IToastQueue<ToastModel> = new Queue<ToastModel>(this.TOASTY_SERVICE_CONFIG.capacity);\r\n private counter: number = 0;\r\n private newToastBehaviorSubject = new BehaviorSubject<ToastModel[]>([]);\r\n public newToast$ = this.newToastBehaviorSubject.asObservable();\r\n private deleteToastBehaviorSubject = new BehaviorSubject<ToastModel | undefined>(undefined);\r\n public deleteToast$ = this.deleteToastBehaviorSubject.asObservable();\r\n private updateToastBehaviorSubject = new BehaviorSubject<ToastModel | undefined>(undefined);\r\n public updateToast$ = this.updateToastBehaviorSubject.asObservable();\r\n\r\n constructor(private _toastySoundService: ToastysoundService) {\r\n }\r\n\r\n setDefaultDuration(d: number): void { this.TOASTY_SERVICE_CONFIG.duration = d; }\r\n getDefaultDuration(): number { return this.TOASTY_SERVICE_CONFIG.duration; }\r\n setCapacity(c: number) { this.TOASTY_SERVICE_CONFIG.capacity = c; this.queue.setCapacity(c); }\r\n getCapacity(): number { return this.queue.getCapacity(); }\r\n\r\n showToast(title: string, message: string, toastConfig?: ToastyConfig | undefined, isPromise?: boolean): number {\r\n this.counter++;\r\n\r\n // if sticky is true duration is infinity else use the provided duration or the default one\r\n const duration = toastConfig?.sticky ? Infinity : (toastConfig?.duration ?? this.TOASTY_SERVICE_CONFIG.duration);\r\n\r\n const toast: ToastModel = {\r\n id: this.counter,\r\n title: title,\r\n message: message,\r\n type: toastConfig?.type ?? ToastType.Basic,\r\n timestamp: Date.now(),\r\n duration: duration,\r\n expires: isPromise ? Infinity : Date.now() + duration,\r\n config: toastConfig,\r\n get icon() {\r\n if (toastConfig?.type == ToastType.Success)\r\n return \"✅\";\r\n if (toastConfig?.type == ToastType.Info)\r\n return \"ℹ️\";\r\n if (toastConfig?.type == ToastType.Warning)\r\n return \"⚠️\";\r\n if (toastConfig?.type == ToastType.Error)\r\n return \"❌\";\r\n\r\n return \"\";\r\n }\r\n };\r\n\r\n this.queue.enqueue(toast);\r\n\r\n this.newToastBehaviorSubject.next([...this.queue.getElements()]);\r\n\r\n if (toast.config?.beep) {\r\n this._toastySoundService.notify();\r\n }\r\n\r\n // if sticky progress bar is not animated and toast will not expire\r\n if (!toast.config?.sticky) {\r\n if (toast.config?.progressBar) {\r\n setTimeout(() => {\r\n this.updateToast(toast.id, { animatePbar: true });\r\n }, 100);\r\n }\r\n\r\n if (!isPromise) {\r\n setTimeout(() => {\r\n this.removeToast(toast.id);\r\n }, duration + 5);\r\n }\r\n }\r\n\r\n return this.counter;\r\n }\r\n\r\n showToastPromise<T>(title: string, promise: ToastyPromise<T>, config?: ToastyConfig) {\r\n const idtoast = this.showToast(title, promise.loading, { ...config, loading: true }, true);\r\n const duration = config?.duration ?? this.TOASTY_SERVICE_CONFIG.duration;\r\n\r\n promise.promise\r\n .then((result) => {\r\n const successMessage =\r\n typeof promise.success === 'function'\r\n ? promise.success(result)\r\n : promise.success;\r\n\r\n this.updateToast(idtoast, {\r\n message: successMessage,\r\n type: ToastType.Success,\r\n expires: Date.now() + duration,\r\n config: { loading: false }\r\n });\r\n })\r\n .catch((err) => {\r\n const errorMessage =\r\n typeof promise.error === 'function'\r\n ? promise.error(err)\r\n : promise.error;\r\n\r\n this.updateToast(idtoast, {\r\n message: errorMessage,\r\n type: ToastType.Error,\r\n expires: Date.now() + duration,\r\n config: { loading: false }\r\n });\r\n })\r\n .finally(() => {\r\n if (!config?.sticky)\r\n setTimeout(() => this.removeToast(idtoast), duration)\r\n }\r\n );\r\n\r\n }\r\n\r\n removeToast(id: number): void {\r\n this.newToastBehaviorSubject.next([...this.queue.getElements()]); // Trigger re-render to start exit animation\r\n setTimeout(() => { const t = this.queue.removeId(id); this.newToastBehaviorSubject.next([...this.queue.getElements()]);}, 500); // Wait for animation to finish before removing from queue\r\n }\r\n\r\n closeToast(id: number): void {\r\n const t = this.queue.removeId(id);\r\n this.newToastBehaviorSubject.next([...this.queue.getElements()]);\r\n }\r\n\r\n updateTouchStart(id: number, touch: Touch): void {\r\n const gesture: ToastGesture = { date: Date.now(), touchStart: touch };\r\n this.updateToast(id, { gesture: gesture });\r\n }\r\n\r\n // Loops through the toasts to find which one was touched and updates its touchEnd\r\n updateTouchEnd(touch: Touch): void {\r\n const toasts = this.queue.getElements().forEach(\r\n t => {\r\n if (t.gesture) {\r\n const deltaY = Math.abs(touch.clientY - t.gesture.touchStart!.clientY);\r\n const deltaX = Math.abs(touch.clientX - t.gesture.touchStart!.clientX);\r\n const deltaTime = Date.now() - t.gesture.date;\r\n\r\n if (deltaTime < 500 && deltaX > this.TOASTY_SERVICE_CONFIG.threshold_offsetX) {\r\n this.closeToast(t.id);\r\n }\r\n else {\r\n t.gesture = undefined; // Reset gesture if not swiped\r\n }\r\n }\r\n }\r\n )\r\n }\r\n\r\n updateTouchMove(touch: Touch): void {\r\n const toasts = this.queue.getElements();\r\n toasts.forEach(t => {\r\n if (t.gesture) {\r\n const deltaX = touch.clientX - t.gesture.touchStart!.clientX;\r\n t.gesture.offsetX = deltaX; // Store the offset for potential use in UI updates\r\n }\r\n });\r\n }\r\n\r\n private updateToast(id: number, newData: Partial<ToastModel>): void {\r\n const toasts = this.queue.getElements();\r\n const index = toasts.findIndex(t => t.id === id);\r\n\r\n if (index !== -1) {\r\n toasts[index] = { ...toasts[index], ...newData };\r\n this.newToastBehaviorSubject.next([...toasts]);\r\n }\r\n }\r\n\r\n}\r\n","import { AsyncPipe, NgClass, NgStyle } from '@angular/common';\r\nimport { Component, HostListener, Input, SimpleChanges } from '@angular/core';\r\nimport { ToastModel, ToastyService } from '../toasty.service';\r\n\r\nenum ToastyContainerPosition {\r\n TOP_LEFT = 'top-left',\r\n TOP = 'top',\r\n TOP_RIGHT = 'top-right',\r\n BOTTOM_LEFT = 'bottom-left',\r\n BOTTOM = 'bottom',\r\n BOTTOM_RIGHT = 'bottom-right'\r\n}\r\n\r\n@Component({\r\n selector: 'toasty',\r\n standalone: true,\r\n imports: [NgClass, NgStyle, AsyncPipe],\r\n templateUrl: './toasty.component.html',\r\n styleUrl: './toasty.component.css'\r\n})\r\nexport class ToastyComponent {\r\n\r\n @Input() position: string = ToastyContainerPosition.BOTTOM_RIGHT;\r\n @Input() duration: number = this._toastService.getDefaultDuration();\r\n @Input() capacity: number = this._toastService.getCapacity();\r\n\r\n protected toasts$ = this._toastService.newToast$;\r\n\r\n private readonly positionMap: Record<string, string[]> = {\r\n 'top-left': ['top', 'left'],\r\n 'top': ['top', 'center'],\r\n 'top-right': ['top', 'right'],\r\n 'bottom-left': ['bottom', 'left'],\r\n 'bottom': ['bottom', 'center'],\r\n 'bottom-right': ['bottom', 'right'],\r\n };\r\n constructor(private _toastService: ToastyService) {\r\n\r\n }\r\n\r\n ngOnInit(): void {\r\n // Subscribe to the toast service to receive new toasts\r\n // this._toastService.newToast$.subscribe(t => {\r\n // if (t) {\r\n // // console.log(t);\r\n // }\r\n // });\r\n\r\n this._toastService.deleteToast$.subscribe(t => {\r\n if (t) {\r\n // we dont need to delete toast, because internally in the service the toast has been deleted and in future toasts, only live toasts will be received from the service\r\n // console.log(t);\r\n }\r\n });\r\n\r\n this._toastService.updateToast$.subscribe(t => {\r\n if (t) {\r\n // console.log(t);\r\n }\r\n })\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['duration']) {\r\n this._toastService.setDefaultDuration(this.duration);\r\n }\r\n if (changes['capacity']) {\r\n this._toastService.setCapacity(changes['capacity'].currentValue);\r\n }\r\n }\r\n\r\n\r\n closeToast(id: number): void {\r\n this._toastService.closeToast(id);\r\n }\r\n\r\n containerClass(): string[] {\r\n return this.positionMap[this.position] ?? [ToastyContainerPosition.BOTTOM_RIGHT];\r\n }\r\n\r\n expires(t: ToastModel): boolean {\r\n return (t.expires < Date.now());\r\n }\r\n\r\n getDurationUntilExpire(expires: number): number {\r\n const duration = expires - Date.now();\r\n return duration > 0 ? duration : 0;\r\n }\r\n\r\n // Swipe to close functionality\r\n @HostListener('touchstart', ['$event'])\r\n onTouchStart(event: TouchEvent) {\r\n const toastid = this.localizeToastIdFromTouch(event);\r\n this._toastService.updateTouchStart(toastid, event.changedTouches[0]);\r\n }\r\n\r\n @HostListener('touchend', ['$event'])\r\n onTouchEnd(event: TouchEvent) {\r\n this._toastService.updateTouchEnd(event.changedTouches[0]);\r\n }\r\n\r\n @HostListener('touchmove', ['$event'])\r\n onTouchMove(event: TouchEvent) {\r\n this._toastService.updateTouchMove(event.changedTouches[0]);\r\n }\r\n\r\n private localizeToastIdFromTouch(event: TouchEvent): number {\r\n let current = event.target as HTMLElement;\r\n let maxnesting : number = 4;\r\n while (!current.classList.contains('toasty') && maxnesting > 0) {\r\n current = current.parentElement as HTMLElement;\r\n maxnesting--;\r\n }\r\n\r\n return parseInt(current.getAttribute('data-toast-id') || '0');\r\n }\r\n\r\n}\r\n","<div class=\"toasty-container\" [ngClass]=\"containerClass()\">\r\n @for (item of toasts$ | async; track item.id) {\r\n <div class=\"toasty-wrapper\" [style.transform]=\"'translateX(' + (item.gesture?.offsetX || 0) + 'px)'\"\r\n [style.transition]=\"item.gesture ? 'none' : 'transform 0.3s ease'\">\r\n <div class=\"toasty\" [attr.data-toast-id]=\"item.id\" [ngClass]=\"item.type\" [class.fadeout]=\"expires(item)\"\r\n [ngStyle]=\"item.config?.customStyle\">\r\n @if (item.icon) {\r\n <div class=\"toasty-icon\">{{item.icon}}</div>\r\n } @else if (item.config?.loading){\r\n <div class=\"toasty-loading\"></div>\r\n } @else {\r\n <div class=\"toasty-noicon\"></div>\r\n }\r\n <div class=\"toasty-content\">\r\n @if (item.title) {\r\n <div class=\"toasty-header\">\r\n <strong class=\"toasty-title\">{{item.title}}</strong>\r\n <!-- <small class=\"toasty-time\">{{item.timestamp}}</small> -->\r\n </div>\r\n }\r\n @if (item.config?.enableHtml) {\r\n <div class=\"toasty-body\" [innerHTML]=\"item.message\"></div>\r\n } @else {\r\n <div class=\"toasty-body\">{{item.message}}</div>\r\n }\r\n </div>\r\n <div class=\"toasty-close\">\r\n <button type=\"button\" class=\"toasty-close\" (click)=\"closeToast(item.id)\">×</button>\r\n </div>\r\n @if (item.config?.progressBar) {\r\n <div class=\"toasty-progress\" [class.animate]=\"item.animatePbar\" [style.transition-duration.ms]=\"item.duration\"></div>\r\n }\r\n </div>\r\n </div>\r\n }\r\n</div>","/*\r\n * Public API Surface of ng-toast-notify\r\n */\r\n\r\nexport * from './lib/toasty.service';\r\nexport * from './lib/toasty/toasty.component';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.ToastysoundService","i1.ToastyService"],"mappings":"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"}