37 lines
1.3 KiB
TypeScript
37 lines
1.3 KiB
TypeScript
|
|
import { DOCUMENT } from '@angular/common';
|
||
|
|
import { Injectable, inject } from '@angular/core';
|
||
|
|
import { take } from 'rxjs/operators';
|
||
|
|
import { ConfigService } from '../../core/config/config.service';
|
||
|
|
import { BrandingConfig } from '../../shared/models/config';
|
||
|
|
|
||
|
|
@Injectable({ providedIn: 'root' })
|
||
|
|
export class BrandingEngineService {
|
||
|
|
private readonly document = inject(DOCUMENT);
|
||
|
|
private readonly configService = inject(ConfigService);
|
||
|
|
|
||
|
|
initialize(): void {
|
||
|
|
this.configService.loadBootstrap().pipe(take(1)).subscribe({
|
||
|
|
next: (bootstrap) => this.applyBranding(bootstrap.branding),
|
||
|
|
error: () => {
|
||
|
|
// Branding bootstrapping should not break app startup.
|
||
|
|
}
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
applyBranding(branding: BrandingConfig): void {
|
||
|
|
const root = this.document.documentElement;
|
||
|
|
root.style.setProperty('--brand-logo-url', `url('${branding.logoUrl}')`);
|
||
|
|
root.style.setProperty('--brand-logo-compact-url', `url('${branding.logoCompactUrl ?? branding.logoUrl}')`);
|
||
|
|
|
||
|
|
const existing = this.document.querySelector("link[rel='icon']") as HTMLLinkElement | null;
|
||
|
|
if (existing) {
|
||
|
|
existing.href = branding.faviconUrl;
|
||
|
|
} else {
|
||
|
|
const link = this.document.createElement('link');
|
||
|
|
link.rel = 'icon';
|
||
|
|
link.href = branding.faviconUrl;
|
||
|
|
this.document.head.appendChild(link);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|