1 import { DOCUMENT } from '@angular/common';
2 import { Inject, Injectable, OnDestroy } from '@angular/core';
4 import { Subscription } from 'rxjs';
6 import { CssHelper } from '~/app/shared/classes/css-helper';
7 import { HealthColor } from '~/app/shared/enum/health-color.enum';
8 import { SummaryService } from './summary.service';
11 export class FaviconService implements OnDestroy {
17 @Inject(DOCUMENT) private document: HTMLDocument,
18 private summaryService: SummaryService,
19 private cssHelper: CssHelper
23 this.url = this.document.getElementById('cdFavicon')?.getAttribute('href');
25 this.sub = this.summaryService.subscribe((summary) => {
26 this.changeIcon(summary.health_status);
30 changeIcon(status?: string) {
31 if (status === this.oldStatus) {
35 this.oldStatus = status;
37 const favicon = this.document.getElementById('cdFavicon');
38 const faviconSize = 16;
39 const radius = faviconSize / 4;
41 const canvas = this.document.createElement('canvas');
42 canvas.width = faviconSize;
43 canvas.height = faviconSize;
45 const context = canvas.getContext('2d');
46 const img = this.document.createElement('img');
50 // Draw Original Favicon as Background
51 context.drawImage(img, 0, 0, faviconSize, faviconSize);
53 if (Object.keys(HealthColor).includes(status as HealthColor)) {
54 // Cut notification circle area
56 context.globalCompositeOperation = 'destination-out';
58 context.arc(canvas.width - radius, radius, radius + 2, 0, 2 * Math.PI);
62 // Draw Notification Circle
64 context.arc(canvas.width - radius, radius, radius, 0, 2 * Math.PI);
66 context.fillStyle = this.cssHelper.propertyValue(HealthColor[status]);
71 favicon.setAttribute('href', canvas.toDataURL('image/png'));
77 this.sub?.unsubscribe();