Some checks failed
CI / Get Changed Files (pull_request) Successful in 31s
CI / Checkstyle Main (pull_request) Has been skipped
CI / Docker backend validation (pull_request) Has been skipped
CI / oxlint (pull_request) Successful in 23s
CI / prettier (pull_request) Failing after 27s
CI / eslint (pull_request) Successful in 31s
CI / test-build (pull_request) Successful in 49s
CI / Docker frontend validation (pull_request) Successful in 1m34s
48 lines
No EOL
1.3 KiB
TypeScript
48 lines
No EOL
1.3 KiB
TypeScript
import { Injectable, Renderer2, RendererFactory2 } from '@angular/core';
|
|
|
|
@Injectable({
|
|
providedIn: 'root'
|
|
})
|
|
export class SoundInitializerService {
|
|
private renderer: Renderer2;
|
|
private observer: MutationObserver;
|
|
|
|
constructor(rendererFactory: RendererFactory2) {
|
|
this.renderer = rendererFactory.createRenderer(null, null);
|
|
|
|
this.observer = new MutationObserver((mutations) => {
|
|
mutations.forEach((mutation) => {
|
|
mutation.addedNodes.forEach((node) => {
|
|
if (node instanceof HTMLElement) {
|
|
this.processElement(node);
|
|
}
|
|
});
|
|
});
|
|
});
|
|
}
|
|
|
|
initialize() {
|
|
document.querySelectorAll('button, a').forEach(element => {
|
|
if (!element.hasAttribute('appPlaySound')) {
|
|
this.renderer.setAttribute(element, 'appPlaySound', '');
|
|
}
|
|
});
|
|
|
|
this.observer.observe(document.body, {
|
|
childList: true,
|
|
subtree: true
|
|
});
|
|
}
|
|
|
|
private processElement(element: HTMLElement) {
|
|
if ((element.tagName === 'BUTTON' || element.tagName === 'A') && !element.hasAttribute('appPlaySound')) {
|
|
this.renderer.setAttribute(element, 'appPlaySound', '');
|
|
}
|
|
|
|
element.querySelectorAll('button, a').forEach(child => {
|
|
if (!child.hasAttribute('appPlaySound')) {
|
|
this.renderer.setAttribute(child, 'appPlaySound', '');
|
|
}
|
|
});
|
|
}
|
|
}
|