Back to home page

EIC code displayed by LXR

 
 

    


Warning, /firebird/firebird-ng/src/app/services/message.service.ts is written in an unsupported language. File is not indexed.

0001 import { Injectable, TemplateRef } from '@angular/core';
0002 import { MatSnackBar } from '@angular/material/snack-bar';
0003 import { BehaviorSubject } from 'rxjs';
0004 import { CdkVirtualScrollViewport } from '@angular/cdk/scrolling';
0005 
0006 export type MessageType = 'error' | 'info' | 'warning';
0007 export type Message = {
0008   type: MessageType;
0009   content: string;
0010   timestamp: Date;
0011 };
0012 
0013 @Injectable({ providedIn: 'root' })
0014 export class MessageService {
0015   private errorQueue: Message[] = [];
0016   private infoQueue: Message[] = [];
0017   private allMessages = new BehaviorSubject<Message[]>([]);
0018   private viewport?: CdkVirtualScrollViewport;
0019 
0020   constructor(private snackBar: MatSnackBar) {}
0021 
0022   registerViewport(viewport: CdkVirtualScrollViewport) {
0023     this.viewport = viewport;
0024   }
0025 
0026   addMessage(type: MessageType, content: string) {
0027     const message: Message = {
0028       type,
0029       content,
0030       timestamp: new Date()
0031     };
0032 
0033     // Add to appropriate queue
0034     if (type === 'error') {
0035       this.errorQueue.push(message);
0036       this.processErrorQueue();
0037     } else {
0038       this.infoQueue.push(message);
0039       this.processInfoQueue();
0040     }
0041 
0042     // Add to all messages log
0043     this.allMessages.next([...this.allMessages.value, message]);
0044 
0045     // Scroll to bottom if viewport exists
0046     setTimeout(() => this.viewport?.scrollToIndex(this.allMessages.value.length));
0047   }
0048 
0049   private processErrorQueue() {
0050     if (this.errorQueue.length > 0) {
0051       const message = this.errorQueue.shift()!;
0052       this.showSnackBar(message);
0053     }
0054   }
0055 
0056   private processInfoQueue() {
0057     if (this.infoQueue.length > 0 && this.errorQueue.length === 0) {
0058       const message = this.infoQueue.shift()!;
0059       this.showSnackBar(message);
0060     }
0061   }
0062 
0063   private showSnackBar(message: Message) {
0064     this.snackBar.open(message.content, 'Dismiss', {
0065       duration: message.type === 'error' ? 5000 : 3000,
0066       panelClass: [`message-${message.type}`],
0067       verticalPosition: 'top',
0068       horizontalPosition: 'right'
0069     }).afterDismissed().subscribe(() => {
0070       if (message.type === 'error') {
0071         this.processErrorQueue();
0072       } else {
0073         this.processInfoQueue();
0074       }
0075     });
0076   }
0077 
0078   getMessageStream() {
0079     return this.allMessages.asObservable();
0080   }
0081 
0082   clearMessages() {
0083     this.allMessages.next([]);
0084   }
0085 }